gpt4 book ai didi

unit-testing - 用 Mockito 模拟返回一个 InvocationTargetException

转载 作者:行者123 更新时间:2023-12-04 03:59:48 26 4
gpt4 key购买 nike

我正在编写一些单元测试,我偶然发现了这个奇怪的“错误”,它阻止了我运行我的单元测试。

当我运行“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正在延伸 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类不是公开的(它是包)。所以当尝试使用反射时,它卡住并抛出这个奇怪的错误。

感谢评论中的人的帮助!

关于unit-testing - 用 Mockito 模拟返回一个 InvocationTargetException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com