【发布时间】:2013-08-12 08:52:05
【问题描述】:
我在 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 是否为空。在上面的代码中,当卡服务为空时,它使用 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");
}
谢谢。
【问题讨论】:
-
logError在超类决赛中吗?如果没有,您可以使用间谍。如果您需要澄清,请告诉我。 -
超类不是最终的。我使用了 spy() 但收到错误为 [想要但未调用:实际上,与此模拟的交互为零。]
-
我认为您需要先发布测试代码,然后才能弄清楚原因。