1

我在 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");
    }

谢谢。

4

2 回答 2

4

正如大卫华莱士所说,您需要使用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. 还更新了测试方法。

于 2013-08-12T11:25:05.803 回答
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");
    }
于 2013-08-12T13:24:54.607 回答