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)
会做的.
小智 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)
这取决于您是使用TestNG还是JUnit进行测试.
Mockito.reset(mockA, mockB, ...)
在一个@BeforeMethod
或一个中重置模拟@AfterMethod
也许我没有关注,但是当你有一个真实的对象时real
:
Object mySpy = spy(real);
Run Code Online (Sandbox Code Playgroud)
然后“ unspy ” mySpy
...只需使用real
。