gpt4 book ai didi

mockito - 部分模拟被认为是不好的做法? (模仿)

转载 作者:行者123 更新时间:2023-12-04 05:30:21 31 4
gpt4 key购买 nike

我正在使用 Mockito 对业务对象进行单元测试。业务对象使用通常从数据库获取数据的 DAO。为了测试业务对象,我意识到使用单独的内存 DAO(将数据保存在 HashMap 中)比编写所有

when(...).thenReturn(...)

陈述。为了创建这样的 DAO,我首先部分模拟了我的 DAO 接口(interface),如下所示:
when(daoMock.getById(anyInt())).then(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
int id = (Integer) invocation.getArguments()[0];
return map.get(id);
}
});

但我突然想到,自己实现一个全新的 DAO 实现(使用内存中的 HashMap)甚至不使用 Mockito(不需要从那个 InvocationOnMock 对象中获取参数)并让测试的业务对象使用这个新的更容易道。

此外,我读过部分模拟被认为是不好的做法。我的问题是:就我的情况而言,我正在做的事情是不好的做法吗?有什么缺点?对我来说这似乎没问题,我想知道潜在的问题可能是什么。

最佳答案

我想知道为什么你需要一个 HashMap 支持你的假 DAO .我想知道您的测试是否太复杂。我非常喜欢使用非常简单的测试方法,每种方法都可以测试 SUT 行为的一个方面。原则上,这是“每个测试一个断言”,尽管有时我会得到一小部分实际的 assertverify行,例如,如果我断言一个复杂对象的正确性。请阅读http://blog.astrumfutura.com/2009/02/unit-testing-one-test-one-assertion-why-it-works/http://blog.jayfields.com/2007/06/testing-one-assertion-per-test.html了解有关此原理的更多信息。

所以对于每种测试方法,你不应该一遍又一遍地使用你的假 DAO。可能只有一次,最多两次。因此,拥有一个大的HashMap在我看来,充满数据是多余的,或者表明您的测试做得比它应该做的要多。对于每种测试方法,您实际上应该只需要一两项数据。如果您使用 DAO 接口(interface)的 Mockito 模拟设置这些,并将您的 when ... thenReturn在测试方法本身中,每个测试都将简单易读,因为特定测试使用的数据将立即可见。

您可能还想阅读“安排、行动、断言”模式(http://www.arrangeactassert.com/why-and-what-is-arrange-act-assert/http://www.telerik.com/help/justmock/basic-usage-arrange-act-assert.html),并注意在每个测试方法中实现此模式,而不是将其不同部分分散在测试中类(class)。

如果没有看到更多的实际测试代码,很难知道给你什么其他建议。 Mockito 应该让 mock 更容易,而不是更难;所以如果你有一个测试没有发生在你身上,那么肯定值得问问你是否在做一些非标准的事情。您所做的不是“部分 mock ”,但对我来说,这确实像是一种测试气味。尤其是因为它将您的许多测试方法结合在一起 - 问问自己,如果您必须更改 HashMap 中的一些数据会发生什么? .

您可以找到 https://softwareengineering.stackexchange.com/questions/158397/do-large-test-methods-indicate-a-code-smell也很有用。

关于mockito - 部分模拟被认为是不好的做法? (模仿),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712266/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com