Java Mockito中的InvocationTargetException
我的测试用例中出现调用目标异常。这是我要测试的类:Java Mockito中的InvocationTargetException,java,junit,mockito,Java,Junit,Mockito,我的测试用例中出现调用目标异常。这是我要测试的类: public class UpdateHandler implements Handler { public void process(UE m, UEC u) { try { Info info = facade1.queryInfo(string).getInfo(); Index index = facade2.findindex(string2); if(facade3.isWhitelisted() {
public class UpdateHandler implements Handler {
public void process(UE m, UEC u) {
try {
Info info = facade1.queryInfo(string).getInfo();
Index index = facade2.findindex(string2);
if(facade3.isWhitelisted() {
facade2.update(info, index);
}
} catch(UpdateException e) {
//log
}
}
这是我的测试文件
public class TestFile {
@Mock
protected Facade1 facade1;
@Mock
protected Facade2 facade2;
@Mock
protected Facade3 facade3;
private Info info;
private Index index;
@InjectMocks
private UpdateHandler updatehandler;
@BeforeMethod
public void beforeTest() {
MockitoAnnotations.initMocks(this);
}
@Test
public void Test1() {
info = getInfo();
index = getIndex();
updateHandler.process(UEprepare(), null);
Mockito.when(facade1.queryInfo(Mockito.anyString()).getInfo()).thenReturn(getInfo());
Mockito.when(facade2.findindex(Mockito.anyString()).thenReturn(getIndex());
Mockito.when(facade3.isWhitelisted()).thenReturn(true);
Mockito.verify(facade1, Mockito.times(1).update(info, index);
}
}
getInfo和getIndex是我在测试文件中创建的两个方法,只是为了创建Info和Index的示例对象。UEprepare是一种准备UE样本对象的方法。UM可以为空。我查过了,这不是问题所在
我得到的错误是空指针异常。具体来说,facade1.queryInfostring的值为null。它应该是一个InfoResult类型的对象,我可以从中提取一个Info对象。我检查了queryInfo方法,它不会在任何地方抛出NPE。它只抛出UpdateException类型的异常,我已经在try-catch中的代码中处理了该异常
当我深入挖掘时,我发现了InvocationTargetException。我不能明确地理解这个异常是从哪里来的,但我认为它与queryInfo方法有关
我已经为我正在使用的所有外观初始化了mock,我认为我也正确地使用了injectmock,所以我一直在研究如何调试它 您的代码中有两个错误: 方法顺序 你有: 被测方法的调用 何时设定期望值 验证期望值Mockito.verify 虽然它应该是 何时设定期望值 被测方法的调用 验证期望值Mockito.verify 连锁期望 对于queryInfo调用的结果,您需要额外的mock,比如@mock queryInfo queryInfo。然后,您需要两次调用来设置此期望值:
Mockito.when(facade1.queryInfo(Mockito.anyString()).thenReturn(queryInfo);
Mockito.when(queryInfo.getInfo()).thenReturn(getInfo());
在您的代码中,queryInfo是一个字段:facade1.queryInfo.getstring,但在测试中,它是一个方法:facade1.queryInfoMockito.anyStrings,这只是一个输入错误。我现在已经改正了。
Mockito.when(facade1.queryInfo(Mockito.anyString()).thenReturn(queryInfo);
Mockito.when(queryInfo.getInfo()).thenReturn(getInfo());