bugfix> spring > 投稿

模擬した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 件
  • 再試行テンプレートが何をしているのかわかりませんが、コードは問題ないようです。しかし、あなたは EasyMock.expect(slackMessageSender.send(EasyMock.isA(HashMap.class))).andThrow(new IOException()); をしたいようです  番号?

    また、再試行ごとに例外をスローする場合は、 EasyMock.expect(slackMessageSender.send(EasyMock.isA(HashMap.class))).andStubThrow(new IOException()); が必要になります。

  • あなたが言っているように、 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);
    
    

あなたの答え