InvocationTargetException

InvocationTargetException

我正在编写一些单元测试,却偶然发现了这个奇怪的“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是一个单独的类
BrandSyncUpdaterStationSyncUpdater扩展了SyncUpdaterUpdater 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/

10-10 22:20