【问题标题】:Mocking a method call on the same mock several times多次模拟同一个模拟上的方法调用
【发布时间】:2015-01-17 03:32:18
【问题描述】:

使用 Mockito 时

我在 2 个测试用例中使用相同的模拟(我知道这是一个糟糕的测试设计,但这是一个实验)

@Test
public void test1()
{
    Mockito.when(mock.method1()).thenAnswer(new Answer<Boolean>()
    {
        @Override
        public Boolean answer(InvocationOnMock temp) throws Throwable
        {
            return true;
        }
    }
    ......
}

@Test
public void test2()
{
    Mockito.when(mock.method1()).thenReturn(false);
    ....
}

当测试按顺序运行时

测试1

测试2

模拟的方法在 test2 中仍然返回 true。这是预期的行为还是错误?

更新:

  1. 方法不是最终的
  2. 我正在使用 JUnit。

【问题讨论】:

  • method1 是最终的吗?如果是这样,则在这两种情况下都会调用您的实际实现。
  • 提供完整的、可重现的测试用例。
  • @user590849 你使用的是 JUnit 还是 TestNG ?
  • 我已经回答了所有的 cmets 作为问题的更新。
  • 这是预期的行为。谁说如果你对同一个方法进行两次 stub,第二次调用就会真正生效?

标签: mockito


【解决方案1】:

正如您提到的,Mockito 建议不要在测试用例中重用模拟。

也就是说,您可能想尝试在每个测试用例中重置模拟:

   List mock = mock(List.class);
   when(mock.size()).thenReturn(10);
   mock.add(1);

   reset(mock);
   //at this point the mock forgot any interactions & stubbing

Resetting mocks

如果这没有帮助

我还看到您在一种方法中使用thenAnswer(),在另一种方法中使用thenReturn()。您可以考虑在这两种情况下都使用thenReturn() 吗?

Mockito 在其文档中包含有关回调存根的建议:

我们建议仅使用带有 thenReturn() 或 thenThrow() 的简单存根。

Stubbing with Callbacks

【讨论】:

  • 好的,但是需要重置模拟吗?此外,在这两种情况下我都不能使用 thenReturn,我需要使用 thenAnswer。但是 Mockito 应该可以同时使用两者。
  • 如果您在多个测试用例中重用模拟,那么对 Test1 中的模拟所做的任何更改也将出现在 Test2 中。在每个测试中重置模拟就可以做到这一点 - 重置模拟以避免这种情况发生。
猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 2020-02-17
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多