当前位置: 首页 > 面试题库 >

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

百里雅珺
2023-03-14
问题内容

当尝试通过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与spring一起使用时,通过bean声明创建Mock对象... ...我在调用mockito时发现了一些奇怪的行为。当多次没有重置Mock对象时,例如: 在测试过程中(在同一个模拟上)多次调用此代码(“mockito.when”)时,测试就会失败并出现错误(BadSqlGrammerException即使该异常实际上是预期的--如果不抛出异常,我会得到一个失败,并且手动抛出

  • 问题内容: 我想知道如果在同一个对象上同步两次,在Java中是否会出现任何奇怪的行为? 场景如下 两种方法都使用该对象并对其进行同步。当第一个方法调用第二个方法时,它会被锁定而停止吗? 我不这么认为,因为它是同一个线程,但是我不确定是否可能会出现其他任何奇怪的结果。 问题答案: 同步块使用 可重入 锁,这意味着如果线程已经持有该锁,则它可以重新获取它而不会出现问题。因此,您的代码将按预期工作。 请

  • 问题内容: 我有一个包含多个CTE的相当复杂的查询,但是其他人都从中提取了1个主要CTE,这是否会导致该主要CTE多次执行? 问题答案: 您可以这样使用CROSS JOIN: 这将防止的多次执行(有关实际执行计划,请参见属性)。 示例:如果执行此查询 使用数据库,那么实际的执行计划将是

  • 问题内容: 我想计算不超过n的平方和。假设n为4,则此代码生成一个列表,列出范围为0到4的地图对象: 轻松一点。现在在m上调用列表,然后求和: 意外的行为是,如果我再次运行最后一行,则总和为0: 我怀疑这是因为调用返回了一个空列表,但是我找不到这种行为的解释。有人可以帮我这个忙吗? 问题答案: 在Python 3中返回一个有状态的迭代器。有状态的迭代器在耗尽后可能只消耗一次,并且不产生任何值。 在

  • 假设我有两个表和。包含和列。有两列和,它们链接回的列。

  • 当我多次调用同一个函数时,每次都传递了不同的参数,我会这样做: 有没有更方便的方法做到这一点呢?