mockito:如何取消模拟方法?

use*_*740 34 java testing mockito spy

我有一个JUnit类,使用不同的方法来执行不同的测试.

我使用Mockito在真实实例上创建一个间谍,然后覆盖一些与我执行的实际测试无关的方法.

有没有办法,只是为了清理我以防万一我的测试后运行的其他一些测试也使用相同的实例,可能会执行一个模拟的方法,他们没有要求模拟,取消模拟方法?

说我有一个名为'wareHouseSpy'的间谍对象

说我重写方法isSomethingMissing:

doReturn(false).when(wareHouseSpy).isSomethingMissing()
Run Code Online (Sandbox Code Playgroud)

什么是正确的方式取消覆盖,并使间谍恢复正常,即使下一个isSomethingMissing的调用运行真正的方法?

就像是

doReturn(Mockito.RETURN_REAL_METHOD).when(wareHouseSpy).isSomethingSpy()
Run Code Online (Sandbox Code Playgroud)

或者可能

Mockito.unmock(wareHouseSpy)
Run Code Online (Sandbox Code Playgroud)

谁知道?我在那个地方找不到任何东西

谢谢!

阿萨夫

Don*_*oby 41

我认为

Mockito.reset(wareHouseSpy)
Run Code Online (Sandbox Code Playgroud)

会做的.

  • 这将重置所有模拟方法。我认为OP仅想重置一种方法(至少那是我在这里寻找的内容:)) (2认同)

小智 11

假设您的大多数测试使用存根响应.然后你会有一个如下所示的setUp()方法:

@Before
public void setUp() {
  wareHouseSpy = spy(realWarehouse);
  doReturn(false).when(wareHouseSpy).isSomethingMissing();
}
Run Code Online (Sandbox Code Playgroud)

现在假设您要撤消存根响应并在一个测试中使用实际实现:

@Test
public void isSomethingMissing_useRealImplementation() {
  // Setup
  when(wareHouseSpy.isSomethingMissing()).thenCallRealMethod();

  // Test - Uses real implementation
  boolean result = wareHouseSpy.isSomethingMissing();
}
Run Code Online (Sandbox Code Playgroud)

  • `.thenCallRealMethod()` 帮助我重置了单独的模拟方法。 (2认同)

Bri*_*ice 9

这取决于您是使用TestNG还是JUnit进行测试.

  • JUnit为每个测试方法创建一个新的自身实例.你基本上不必担心重置模拟.
  • 使用TestNG,您必须Mockito.reset(mockA, mockB, ...)在一个@BeforeMethod或一个中重置模拟@AfterMethod


Tom*_*icz 3

也许我没有关注,但是当你有一个真实的对象时real

Object mySpy = spy(real);
Run Code Online (Sandbox Code Playgroud)

然后“ unspymySpy...只需使用real