我在ATG中有一个表单处理程序,具有以下句柄方法 -
public boolean handleFindCards(DynamoHttpServletRequest pRequest, DynamoHttpServletResponse pResponse)
throws IOException, ServletException {
Card card = cardService.getCard();
if (card == null) {
if (isLoggingError()) {
logError("Card Service is null");
}
} else {
// Other code
}
return checkFormRedirect(getSuccessURL(), getSuccessURL(), pRequest, pResponse);
}
表单处理程序正在使用其中一个超类 GenericService 的日志记录。我想编写一个测试来检查cardService是否为null。在上面的代码中,当card service为null时,它使用logError编写错误消息。我们可以在这里使用ArgumentCaptor来验证消息。或者还有其他方法可以测试这种情况吗?
在这里,嘲讽和间谍将如何协同工作?我应该将获取卡对象的调用存根为 -
when(cardServiceMock.getCard()).thenReturn(cardMock);
这是我的测试方法 -
@Test
public void testHandleCardServiceIfCardIsNull() throws IOException, ServletException {
CardService cardServiceMock = mock(CardService.class);
when(cardServiceMock.getCard()).thenReturn(null);
CardOperationsFormHandler testObjSpy = spy(new CardOperationsFormHandler());
testObjSpy.handleFindCards(requestMock, responseMock);
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.verify(testObjSpy).logError(argumentCaptor.capture());
Assert.assertEquals(argumentCaptor.getValue(), "Card Service is null");
}
感谢。
答案 0 :(得分:3)
正如David Wallace所说,你需要使用Mockito.spy(T object)
。
所以用一个简单的方法:
public void runArgumentCaptor() {
logError("This is an error");
}
测试可能如下所示:
@Spy @InjectMocks private SomeClassName testObj;
@Test(groups = { "unit" })
public void runArgumentCaptorTest() throws Exception {
testObj.runArgumentCaptor();
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.verify(testObj).logError(argumentCaptor.capture());
Assert.assertEquals(argumentCaptor.getValue(), "This is an error");
}
<强> [编辑] 强>
添加了testObj
的声明。请注意其他@Spy
。还更新了测试方法。
答案 1 :(得分:1)
现在正在运作。当radimpe说我用间谍代替了模拟。所以,在这里我创建cardServiceSpy而不是cardServiceMock然后使用存根。另外,需要使用doReturn进行存根。这是方法 -
@Test
public void testHandleCardServiceIfCardIsNull() throws IOException, ServletException {
CardService cardServiceSpy = spy(new CardService());
doReturn(null).when(cardServiceSpy).getCard();
CardOperationsFormHandler testObjSpy = spy(new CardOperationsFormHandler());
testObjSpy.handleFindCards(requestMock, responseMock);
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.verify(testObjSpy).logError(argumentCaptor.capture());
Assert.assertEquals(argumentCaptor.getValue(), "Card Service is null");
}