我正在编写一些单元测试,却偶然发现了这个奇怪的“bug”,这使我无法运行单元测试。
当我运行“when(...)。thenReturn(...)”时,我收到一个InvocationTargetException。然后奇怪的是,当我调试时,它会进入真实对象并在空成员上崩溃。当我调试其他“when”时,它进入了一个名为“Intercept”的函数,该函数阻止了真实代码的执行……我不明白该对象的不同之处以及如何防止这种奇怪的行为。
这是我的单元测试:
@Test
public void getSyncStatusShouldReturnValueFromDiskWhenNotRunning() throws IOException {
//Arrange
when(updater.isDone()).thenReturn(true);
when(brandSyncUpdater.isDone()).thenReturn(true); //This is where it throw error
when(stationSyncUpdater.isDone()).thenReturn(true);
//Act
//Assert
}
这是我的setUp()和单元类测试的成员部分
private Updater updater;
private BrandSyncUpdater brandSyncUpdater;
private StationSyncUpdater stationSyncUpdater;
@Before
public void setUp() {
updater = mock(Updater.class);
brandSyncUpdater = mock(BrandSyncUpdater.class);
stationSyncUpdater = mock(StationSyncUpdater.class);
}
我不知道它是否相关,但是BrandSyncUpdater和StationSyncUpdater都有一个名为SyncUpdater的父级,isDone()函数位于该父级。
编辑
类别
Updater
是一个单独的类BrandSyncUpdater
和StationSyncUpdater
扩展了SyncUpdater
Updater isDone()
签名和代码:public boolean isDone() {
return states.isEmpty();
}
SyncUpdater isDone()
签名和代码:public boolean isDone() {
return currentStates.isEmpty();
}
编辑2
这是控制台中错误的堆栈跟踪。您会注意到这里的错误是“NullPointerException”,因为它尝试使用变量
currentStates
。但是在调试时,mockito抛出的错误是InvocationTargetException。java.lang.NullPointerException
at com.stingray360.clap.synchronizer.contentcontroller.queue.SyncUpdater.isDone(SyncUpdater.java:117)
at com.stingray360.clap.synchronizer.contentcontroller.queue.BrandSyncUpdater.isDone(BrandSyncUpdater.java:15)
at com.stingray360.clap.synchronizer.contentcontroller.SyncDispatcherTest.getSyncStatusShouldReturnValueFromDiskWhenNotRunning(SyncDispatcherTest.java:190)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
最佳答案
我只是通过错误尝试其他方法发现了问题。
我的SyncUpdater
类不是公开的(它是包)。因此,当尝试使用Reflection时,它被卡住并抛出此奇怪的错误。
感谢您在评论中给予的帮助!
关于unit-testing - 与Mockito的模拟返回InvocationTargetException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33217141/