要求5.当多次在同一对象上



当尝试在Spring中使用Mock时,通过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()));

在测试期间(在同一模拟上),只要多次调用此代码("mockitto .when"),测试就会失败并出现错误(BadSqlGrammerException,即使此异常是实际期望的—如果我不抛出异常,我确实会失败,并且手动抛出它可以正常工作)。这是预期行为吗?Mockito似乎建议每次都创建一个新的mock,这意味着为每个方法创建DAO…?

当我调用Mockito时到底发生了什么?什么时候法两次?mock应该如何反应?取代这种行为?忽略它吗?不幸的是,大多数搜索只给出了如何在多次调用方法本身时返回不同结果的结果,而不是多次调用mockitto时的预期结果。

我只是想在这里理解Mockito和最佳实践,因为仅仅因为看起来有效而使用某些东西似乎是一个坏主意…

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(object.fooMethod()).then()时,fooMethod()实际上被调用了。
另一点是我们不能第一次观察到它,因为它调用了模拟对象。但是当我们第二次写when时,我们就有了fooMethod()的一些行为(我们之前设置了它,在你的情况下是Exception)。

要更好地检查这一点,可以执行spy object:

Bar spyBar = Mockito.spy(Bar.class)
when(spyBar.fooMethod()).then()...

fooMethod()将实际调用

相关内容

  • 没有找到相关文章

最新更新