Как заставить JUnit принимать любое лямбда-выражение - PullRequest
0 голосов
/ 01 мая 2018

Я использую SpringAMQP, где я тестирую метод продюсера (в основном шаблон AMQP), который выглядит следующим образом.

public void send(Message message, Throwable error, String queue, String routingKey) {

    this.amqpTemplate.convertAndSend(
        RabbitConfiguration.ERROR_EXCHANGE,
        RabbitConfiguration.ERROR_ROUTING_KEY,
        message,
        messageMetaData -> {

            messageMetaData.getMessageProperties().getHeaders().put("x-death-reason", error.getMessage());

            return messageMetaData;
        }
    );
}

Я тестирую этот код со следующим

import static org.hamcrest.Matchers.any;
....
@Test
public void will_create_error_message_if_incorrect_payload_is_given() {

    AmqpTemplate amqpTemplate = mock(AmqpTemplate.class);
    Throwable throwable = mock(Throwable.class);
    when(throwable.getMessage()).thenReturn("first");
    when(throwable.getStackTrace()).thenReturn(null);

    ErrorMessageProducer errorMessageProducer = new ErrorMessageProducer(amqpTemplate);

    Message message = MessageBuilder.withBody("test".getBytes()).build();

    verify(amqpTemplate).convertAndSend(
        eq(RabbitConfiguration.ERROR_EXCHANGE),
        eq(RabbitConfiguration.ERROR_ROUTING_KEY),
        any(Message.class),
        Mockito.any()
    );
}

Но я получаю Invalid use of argument matchers! 4 matchers expected, 3 recorded. Можно ли как-нибудь проверить с помощью лямбды или вообще игнорировать лямбду.

1 Ответ

0 голосов
/ 01 мая 2018

Проблема в том, что вы используете неправильно any().

verify(amqpTemplate).convertAndSend(
    eq(RabbitConfiguration.ERROR_EXCHANGE),
    eq(RabbitConfiguration.ERROR_ROUTING_KEY),
    any(Message.class),
    Mockito.any()
);

Здесь ваш 3-й аргумент использует any из org.hamcrest.Matchers.any, однако 4-й аргумент использует Mockito.any(). Таким образом, третий аргумент не определяется как сопоставление, а представляет собой обычный аргумент.

Чтобы проверить свою лямбду, вам, вероятно, следует использовать ArgumentCaptor .

ArgumentCaptor<Runnable> argument = ArgumentCaptor.forClass(Runnable.class);
verify(mock).doSomething(any(), argument.capture());
argument.getValue().run();
...verify that lambda called your services...

Вы можете изменить Runnable на любой тип функции, которую фактически представляет ваша лямбда: то есть Function / Callable.

...