1

我有一个运行 Spring Cloud 合约的 Spring Boot 应用程序

messageTest.groovy

Contract.make {
    label 'some_label'
    input {
        triggeredBy('messageTriggered()')
    }
    outputMessage {
        sentTo 'verifications'
        body 'foo'
        headers {
            messagingContentType(applicationJson())
        }
    }
}

我的测试失败了,当我查看构建文件夹中生成的测试时,

ContractVerifierMessage response = contractVerifierMessaging.receive("verifications");

上面的这一行不断抛出异常

No bean named 'verifications' available

我究竟做错了什么?

它看起来像它的注射SpringIntegrationStubMessages而不是StreamStubMessages......

我使用 Spring Boot 1.5.8 和 spring cloud starter kafka

compile 'org.springframework.cloud:spring-cloud-starter-stream-kafka'
4

2 回答 2

0

如果您在类路径上同时具有 spring 集成和流,并且由于某种原因未拾取流,则尝试设置stubrunner.integration.enabledfalse. 这样,应该只选择 Stream。

于 2017-12-18T10:24:19.130 回答
0

我猜您需要 MessageVerifier bean 作为 StreamStubMessages 类的实例。这是一个有条件的,它的实例化取决于类路径的内容。您可以尝试通过显式实例化来解决问题:

@Bean
MessageVerifier<Message<?>> activeMqContractVerifier(ApplicationContext applicationContext) {
    return new StreamStubMessages(applicationContext);
}

它应该以 no class def found 异常结束,这将引导您丢失依赖项。

我有类似的问题,但在我的情况下,有 ActiveMQ 代替了 Kafka(没有弹簧集成或弹簧流)。因此,可用的 MessageVerifier 似乎都不合适。对我来说,MessageVerifier 的以下简约实现(它不是 ActiveMQ 的通用解决方案)完成了这项工作:

import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MessagingMessageConverter;
import org.springframework.messaging.Message;
import javax.jms.JMSException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class ActiveMqStubMessages implements MessageVerifier<Message<?>> {
    private final ApplicationContext applicationContext;

    public ActiveMqStubMessages(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Override
    public void send(Message message, String destination) {
        throw new UnsupportedOperationException();
    }

    @Override
    public <T> void send(T payload, Map<String, Object> headers, String destination) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Message<?> receive(String destination, long timeout, TimeUnit timeUnit) {
        final JmsTemplate jmsTemplate = applicationContext.getBean(JmsTemplate.class);
        final long originalReceiveTimeout = jmsTemplate.getReceiveTimeout();
        try {
            jmsTemplate.setReceiveTimeout(TimeUnit.MILLISECONDS.convert(timeout, timeUnit));
            return (Message) new MessagingMessageConverter().fromMessage(jmsTemplate.receive(destination));
        } catch (JMSException e) {
            throw new RuntimeException(e);
        } finally {
            jmsTemplate.setReceiveTimeout(originalReceiveTimeout);
        }
    }

    @Override
    public Message<?> receive(String destination) {
        return receive(destination, 3, TimeUnit.SECONDS);
    }
}
于 2019-05-16T07:56:51.960 回答