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());