Получить EasyMock для исключения во время повторного вызова - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь написать модульный тест, который выдает исключение на RetryTemplate, который я смоделировал. Текущий тест не проходит по моему утверждению.

/**
     * Test maybeSendNotification() IOException.
     */
    @Test(expected = RuntimeException.class)
    public void testMaybeSendNotificationIOException() throws IOException
    {
        Instance instance = new Instance();
        instance.setState(new InstanceState().withName("DOWN"));
        instance.setKeyName("prod");

        EasyMock.expect(slackMessageSender.send(EasyMock.isA(HashMap.class))).andThrow(new RuntimeException());

        EasyMock.replay(slackMessageSender);
        assertFalse(instanceService.maybeSendNotification(instance));
        EasyMock.verify(slackMessageSender);
    }

slackMessageSender и retryTemplate оба являются ложными.

Это тестируемый метод:

    boolean maybeSendNotification(Instance newInstance)
        {
            Map<String, String> context = new HashMap<String, String>();
            context.put("message", format("Instance with ID '%s' for load balancer '%s' status is DOWN.",
                    newInstance.getInstanceId(),
                    newInstance.getKeyName()));

            try
            {
                retryTemplate.execute( c -> slackMessageSender.send(context));
                LOG.debug(String.format("Successfully sent Slack notification for instance '%s'.", newInstance.getInstanceId()));
                return true;
            }
            catch(IOException e)
            {
                LOG.debug(String.format("Failed to send Slack notification for instance '%s'.", newInstance.getInstanceId()));
                return false;
}

В настоящее время метод возвращает true, но я бы хотел, чтобы он выдавал IOException и возвращал false. Как мне издеваться над этим поведением?

Ответы [ 2 ]

0 голосов
/ 10 августа 2018

Поскольку вы говорите, что retryTemplate также является ложным, я бы предположил, что в настоящее время метод slackMessageSender.send никогда не выполняется в тесте, потому что обратный вызов retryTemplate.execute не вызывается. Я думаю, вам нужно настроить макет retryTemplate для выполнения его параметра. Что-то вроде:

EasyMock.expect(retryTemplate.execute).andAnswer(() -> {
    final RetryCallback retryCallback = (RetryCallback) getCurrentArguments()[0];
    return retryCallback.doWithRetry(context);
});
EasyMock.replay(retryTemplate);

Также обратите внимание, что при @Test(expected = RuntimeException.class) строка EasyMock.verify(slackMessageSender); никогда не будет выполнена, а макет slackMessageSender никогда не проверяется, потому что код будет завершен при возникновении исключения.

С помощью jUnit 5 вы сможете сделать что-то вроде:

EasyMock.replay(slackMessageSender);
IOException exception = assertThrows(IOException.class, () -> {
    assertFalse(instanceService.maybeSendNotification(instance));
});
EasyMock.verify(slackMessageSender);
0 голосов
/ 02 июля 2018

Я не знаю, что делает шаблон повтора, но код выглядит нормально. Тем не менее, вы, кажется, хотите сделать EasyMock.expect(slackMessageSender.send(EasyMock.isA(HashMap.class))).andThrow(new IOException()); нет?

И если вы хотите выдавать исключение для каждой попытки, вам понадобится EasyMock.expect(slackMessageSender.send(EasyMock.isA(HashMap.class))).andStubThrow(new IOException());

...