public class ServiceClass {
@Autowired
ConnClient connClient;
public void abc() {
result = connClient.query(arg1, arg2); // verify called once.
allDocsReturned = result.getResults(); // throws NPE
}
}
我需要验证 connClient.query(arg1,arg2)至少被调用一次。因此,在测试用例文件中,我正在调用方法 abc()
@InjectMocks
ServiceClass serviceClass;
@Mock
ConnClient connClient;
@Test
public void testABC() {
serviceClass.abc();
verify(connClient, times(1)).query(arg1,arg2);
}
我收到NullPointerException,因为上面调用了 result.getResults()行,因为结果为null,并且测试用例失败。 请帮忙。
答案 0 :(得分:0)
您需要模拟对connClient.query
和ResultSet
的调用:
@InjectMocks
ServiceClass serviceClass;
@Mock
ConnClient connClient;
@Test
public void testABC() {
ResultSet rs = mock(ResultSet.class);
when(rs.getResults()).thenReturn(//here return the object of type of your variable allDocsReturned);
when(connClient.query(arg1,arg2)).thenReturn(rs);
serviceClass.abc();
verify(connClient, times(1)).query(arg1,arg2);
}
答案 1 :(得分:0)
您的类ConnClient
是一个模拟,这就是为什么调用connClient.query(arg1, arg2)
将返回null ad从而在取消引用结果时引发NPE的原因。
在这种情况下,您可以指定方法调用的返回值,即
doReturn(someObject).when(connClient).query(arg1,arg2);
其中someObject
可以作为模拟对象(或者,您可以返回一个具体值)。
完成此操作后,result
将不再为null,也不会抛出NPE。
请注意,如果以后取消引用result
,则还必须模拟getResults()
调用。
编辑:
@InjectMocks
ServiceClass serviceClass;
@Mock
ConnClient connClient;
@Mock
Result result;
@Test
public void testABC() {
doReturn(result).when(connClient).query(arg1,arg2);
serviceClass.abc();
verify(connClient, times(1)).query(arg1,arg2);
}
现在结果将不会为空,但是,allDocsReturned仍将为空,但不会导致NPE带有您发布的代码