mockito:如何取消模拟方法?

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

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

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

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

说我重写方法isSomethingMissing

doReturn(false).when(wareHouseSpy).isSomethingMissing() 

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

就像是

 doReturn(Mockito.RETURN_REAL_METHOD).when(wareHouseSpy).isSomethingSpy() 

或者可能

 Mockito.unmock(wareHouseSpy) 

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

谢谢!

阿萨夫

我认为

 Mockito.reset(wareHouseSpy) 

会这样做的。

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

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

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

 @Before public void setUp() { wareHouseSpy = spy(realWarehouse); doReturn(false).when(wareHouseSpy).isSomethingMissing(); } 

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

 @Test public void isSomethingMissing_useRealImplementation() { // Setup when(wareHouseSpy.isSomethingMissing()).thenCallRealMethod(); // Test - Uses real implementation boolean result = wareHouseSpy.isSomethingMissing(); } 

也许我没有关注,但当你有一个真实的物体时:

 Object mySpy = spy(real); 

然后“ 解开mySpy ……只使用real

“正常”方式是在“setUp”方法中重新实例化。 但是,如果你有一个由于某种原因构造成本昂贵的真实对象,你可以这样做:

 public class MyTests { private static MyBigWarehouse realWarehouse = new MyBigWarehouse(); private MyBigWarehouse warehouseSpy; @Before public void setUp() { warehouseSpy = spy(realWarehouse); // same real object - brand new spy! doReturn(false).when(wareHouseSpy).isSomethingMissing(); } @Test ... @Test ... @Test ... } 

特别针对这篇文章:

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

如果您正在使用JUnit,最简单的方法是使用@Before@After (其他框架具有等价物)并重新创建实例和间谍,这样任何测试都不会依赖于任何其他任何测试或@Before影响测试。 然后,您可以在每个测试内部执行spy / mock的特定于测试的配置。 如果由于某种原因您不想重新创建对象,则可以重新创建间谍。 无论哪种方式,每个人每次都从一个新的间谍开始。