Сгенерированные тесты (сторона производителя) завершились неудачно в контракте Spring Cloud и AMQP / RabbitMQ - PullRequest
0 голосов
/ 29 июня 2018

Я пытался использовать облачный контракт AMQP / RabbitMQ и Spring в моих проектах микросервисов для определения договора между производителями и потребителями.

Я использую последнюю версию Spring Boot 2.0.3 и Spring Cloud Contract 2.0.0.

Я подготовил пример проекта для воспроизведения проблемы.

На стороне производителя я создал базовый тестовый класс:

@SpringBootTest(properties = "stubrunner.amqp.enabled=true")
@RunWith(SpringRunner.class)
@AutoConfigureMessageVerifier
public class MessageVerifierBase {

    @Autowired
    MessageVerifier verifier;

    @Autowired
    Sender sender;

    public void send() {
        this.sender.send(Notification.builder().body("test message").build());
    }

    @Before
    public void setup() {
        verifier.receive("notification.exchange", 100, TimeUnit.MILLISECONDS);
    }
}

Sender только что позвонил RabbitTemplate.

    @Component
public class Sender {

    @Autowired
    AmqpTemplate amqpTemplate;

    public void send(Notification notification){
        this.amqpTemplate.convertAndSend("notification.exchange", "notification.messages", notification);
    }

}

И создал договор в заводном формате.

    org.springframework.cloud.contract.spec.Contract.make {
    description("""
        send messages by rabbitmq
    """)
    label "notification.event"
    // input to the contract
    input {
        // the contract will be triggered by a method
        triggeredBy('send()')
    }
    outputMessage {
        sentTo "notification.exchange"
        body([
            body: "test message",
            type: "MESSAGE"
        ])
        headers {
            header("contentType", applicationJsonUtf8())
            header("__TypeId__", "com.example.demo.Notification")
        }
    }
}

Когда я запустил mvn clean install, он вышел из строя и сообщил о следующей проблеме:

    Wanted but not invoked:
rabbitTemplate.send(
    "notification.exchange",
    <Capturing argument>,
    <Capturing argument>,
    <any org.springframework.amqp.rabbit.support.CorrelationData>
);
-> at org.springframework.cloud.contract.verifier.messaging.amqp.SpringAmqpStubMessages.receive(SpringAmqpStubMessages.java:110)

However, there were exactly 3 interactions with this mock:
rabbitTemplate.getMessageConverter();
-> at org.springframework.amqp.rabbit.core.RabbitMessagingTemplate.afterPropertiesSet(RabbitMessagingTemplate.java:111)

rabbitTemplate.getMessageConverter();
-> at org.springframework.amqp.rabbit.core.RabbitMessagingTemplate.afterPropertiesSet(RabbitMessagingTemplate.java:113)

rabbitTemplate.getMessageConverter();
-> at org.springframework.cloud.contract.verifier.messaging.amqp.ContractVerifierAmqpAutoConfiguration.contractVerifierMessaging(ContractVerifierAmqpAutoConfiguration.java:82)

1 Ответ

0 голосов
/ 02 июля 2018

Я только что исправил проблему - https://github.com/spring-cloud/spring-cloud-contract/issues/676. Проблема была с миграцией Mockito (и 2 отсутствующих теста, которые я добавил). Таким образом, проверка Mockito, является ли переданный объект заданным классом, изменила его поведение. В предыдущих версиях он принимал значения NULL, теперь нет. Там были пропущенные тесты для проверки нулевого значения, иначе, очевидно, мы бы поймали его раньше. Спасибо за отчет, спасибо за образец.

...