модульное тестирование ListenableFuture kafkaTemplate.send всегда возвращает ноль - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь протестировать обратные вызовы из kafkaTemplate.send (), но он не работает должным образом. Вот фрагмент кода кода, который я пытаюсь протестировать.

    @Override
    public void sendMessage(String topicName, String message) {

        ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topicName, message);
        future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {

            @Override
            public void onSuccess(SendResult<String, String> result) {
                System.out.print("Success")
            }
            @Override
            public void onFailure(Throwable ex) {
                System.out.print("Failed")
            }
        });
    }

, и это код модульного теста


    private KafkaTemplate<String, String> kafkaTemplate;
    private KafkaService kafkaService;
    private SendResult<String, String> sendResult;
    private ListenableFuture<SendResult<String, String>> future;
    private RecordMetadata recordMetadata
    private String topicName
    private String message



    def setup() {
        kafkaTemplate = Mock(KafkaTemplate.class)
        kafkaService = new KafkaService(kafkaTemplate);
        topicName = "test.topic"
        message = "test message"
        sendResult = Mock(SendResult.class);
        future = Mock(ListenableFuture.class);
        recordMetadata = new RecordMetadata(new TopicPartition(topicName, 1), 1L, 0L, 0L, 0L, 0, 0);
    }

    def "Test success send message method"() {
        given:
        sendResult.getRecordMetadata() >> recordMetadata
        kafkaTemplate.send(_ as String, _ as String) >> future

        when:
        kafkaService.sendMessage(topicName, message)

        then:
        // catch success or failed here.

        1 * kafkaTemplate.send(_,_) >> {arguments ->
            final String topicNameParam = arguments.get(0)
            final String messageParam = arguments.get(1)

            assert topicNameParam == topicName
            assert messageParam == message
        }
    }

, основанный на будущем отладчика, в этом сценарии равен нулю

ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topicName, message); // future null
 future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() { // future null

Я уже прочитал много ответов здесь, но это не решило проблему, или они не объясняют это хорошо, чтобы я понял, где проблема. как этот { ссылка }

спасибо за помощь заранее!

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вы совершаете типичную ошибку новичка Спока при попытке сочетать насмешки и заглушки : сначала объявляйте результат окурка в блоке given:, а затем проверяйте взаимодействие при проверке ( без результат заглушки) в блоке then:. Но издевательство и заглушка всегда должны происходить в одном и том же взаимодействии , как описано в главе руководства, с которой я связан. В руководстве также объясняется, что взаимодействие в блоке then: выигрывает в вашем случае, т. Е. Поскольку вы не указываете там результат заглушки, результатом по умолчанию будет null.

Кроме того, вы задаете аргумент проверка гораздо сложнее, чем необходимо. Просто используйте вместо этого простые ограничения аргументов. Ваш тест пройдет, если вы измените его следующим образом:

  def "Test success send message method"() {
    given:
    sendResult.getRecordMetadata() >> recordMetadata
//    kafkaTemplate.send(_ as String, _ as String) >> future

    when:
    kafkaService.sendMessage(topicName, message)

    then:
    // catch success or failed here.
    1 * kafkaTemplate.send(topicName, message) >> future
  }
0 голосов
/ 08 апреля 2020

Так как вы издеваетесь над KafkaTemplate; вам нужно смоделировать метод send, чтобы вернуть будущее.

Я не знаком со Споком.

С Mockito это будет

SettableListenerFuture<SendResult<?, ?>> future = new SettableListenerFuture<>();
given(template.send(anyString(), anyString())).willReturn(future);
...