在同一对象上多次调用Mockito.when?

当尝试通过Spring使用Mockito时,通过bean声明创建Mock对象…

<bean id="accountMapper" class="org.mockito.Mockito" factory-method="mock"> 

<constructor-arg value="org.example.persistence.mybatis.mappers.AccountMapper" />

</bean>

…我多次调用Mockito。时发现一些奇怪的行为,而没有重置Mock对象,例如:

Mockito.when(this.accountMapper.createBadGrammarException()).thenThrow(new BadSqlGrammarException("Bla", null, new SQLException()));

一旦在测试期间(在同一模拟上)多次调用此代码(“

Mockito.when”),测试就会失败并显示错误(BadSqlGrammerException,即使实际上是预期的异常,我也会失败-

如果我不抛出异常,则手动抛出该异常就可以了)。这是预期的行为吗?Mockito似乎建议每次都创建一个新的模拟,这意味着为每种方法都创建DAO

…?

当我两次调用Mockito.when方法时,会发生什么?模拟应该如何反应?替换行为?忽略它?不幸的是,大多数搜索仅产生关于如何多次调用该方法本身而返回不同结果的结果,而不是多次调用Mockito时所期望的结果。

我只是想在这里理解Mockito和最佳实践,因为仅仅因为SEEMS起作用而进行某些工作似乎是一个坏主意…

回答:

问题之一Mockito.when是传递给它的参数是您要存根的表达式。因此,当您Mockito.when对同一个方法调用使用两次时,第二次使用它,您实际上会得到第一次插拔的行为。

我实际上建议不要使用Mockito.when。使用它时,您可能会陷入很多陷阱–在很多情况下,您需要使用其他语法。“更安全”的替代语法是Mockito方法的“

do”族。

doReturn(value).when(mock).method(arguments ...);

doThrow(exception).when(mock).method(arguments ...);

doAnswer(answer).when(mock).method(arguments ...);

所以你要

doThrow(new BadSqlGrammarException(??, ??, ??)).when(accountMapper).createBadGrammarException();

如果您从Mockito开始,那么我建议您学习使用“

do”系列。它们是模拟void方法的唯一方法,Mockito文档专门提到了这一点。但是只要可以使用它们就Mockito.when可以使用。因此,如果您使用“

do”系列,那么您的测试将具有更高的一致性,并且学习曲线更少。

有关 必须 使用“

do”族的情况的更多信息,请参阅我对形成Mockito“语法”的回答

以上是 在同一对象上多次调用Mockito.when? 的全部内容, 来源链接: utcz.com/qa/431782.html

回到顶部