Fixes messaging

This commit is contained in:
Marcin Grzejszczak
2022-11-18 20:11:10 +01:00
parent 65a6c5e95c
commit a5b97e6175
29 changed files with 144 additions and 118 deletions

View File

@@ -109,8 +109,7 @@ testImplementation(group: 'org.springframework.cloud', name: 'spring-cloud-strea
The main interface used by the tests is
`org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender` and `org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver`.
It defines how to send and receive messages. If you need both sender and receiver capabilities you can use `org.springframework.cloud.contract.verifier.messaging.MessageVerifier` interface. You can create your own implementation to
achieve the same goal.
It defines how to send and receive messages.
In a test, you can inject a `ContractVerifierMessageExchange` to send and receive
messages that follow the contract. Then add `@AutoConfigureMessageVerifier` to your test.

View File

@@ -389,7 +389,7 @@ dependencies, tries to:
- Start a WireMock server for each Maven dependency on a random port from the provided
range of ports or the provided port
- Feed the WireMock server with all JSON files that are valid WireMock definitions
- Send messages (remember to pass an implementation of `MessageVerifier` interface)
- Send messages (remember to pass an implementation of `MessageVerifierSender` interface)
Stub Runner uses the https://wiki.eclipse.org/Aether[Eclipse Aether] mechanism to download the Maven dependencies.
Check their https://wiki.eclipse.org/Aether[docs] for more information.
@@ -430,7 +430,7 @@ See the <<features-stub-runner-common-properties-junit-spring>> for more informa
how to apply global configuration of Stub Runner.
IMPORTANT: To use the JUnit rule or JUnit 5 extension together with messaging, you have to provide an implementation of the
`MessageVerifier` interface to the rule builder (for example, `rule.messageVerifier(new MyMessageVerifier())`).
`MessageVerifierSender` and `MessageVerifierReceiver` interface to the rule builder (for example, `rule.messageVerifierSender(new MyMessageVerifierSender())`).
If you do not do this, then, whenever you try to send a message, an exception is thrown.
[[features-stub-runner-rule-maven-settings]]

View File

@@ -20,13 +20,14 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
/**
* @author Olga Maciaszek-Sharma
* @since 2.1.0
*/
class ExceptionThrowingMessageVerifier implements MessageVerifier {
class ExceptionThrowingMessageVerifier implements MessageVerifierSender, MessageVerifierReceiver {
private static final String EXCEPTION_MESSAGE = "Please provide a custom MessageVerifier to use this feature";

View File

@@ -43,7 +43,8 @@ import org.springframework.cloud.contract.stubrunner.StubNotFoundException;
import org.springframework.cloud.contract.stubrunner.StubRunnerOptions;
import org.springframework.cloud.contract.stubrunner.StubRunnerOptionsBuilder;
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
/**
* JUnit 5 extension that allows to download and run stubs.
@@ -71,7 +72,9 @@ public class StubRunnerExtension implements BeforeAllCallback, AfterAllCallback,
private StubRunnerOptionsBuilder stubRunnerOptionsBuilder = new StubRunnerOptionsBuilder(
StubRunnerOptions.fromSystemProps());
private MessageVerifier verifier = new ExceptionThrowingMessageVerifier();
private MessageVerifierSender verifierSender = new ExceptionThrowingMessageVerifier();
private MessageVerifierReceiver verifierReceiver = new ExceptionThrowingMessageVerifier();
public StubRunnerExtension() {
}
@@ -121,7 +124,7 @@ public class StubRunnerExtension implements BeforeAllCallback, AfterAllCallback,
}
private void before() {
stubFinder(new BatchStubRunnerFactory(builder().build(), verifier()).buildBatchStubRunner());
stubFinder(new BatchStubRunnerFactory(builder().build(), verifierSender()).buildBatchStubRunner());
stubFinder().runStubs();
}
@@ -188,8 +191,14 @@ public class StubRunnerExtension implements BeforeAllCallback, AfterAllCallback,
}
@Override
public StubRunnerExtension messageVerifier(MessageVerifier messageVerifier) {
verifier(messageVerifier);
public StubRunnerExtension messageVerifierSender(MessageVerifierSender messageVerifier) {
verifierSender(messageVerifier);
return this.delegate;
}
@Override
public StubRunnerExtension messageVerifierReceiver(MessageVerifierReceiver messageVerifier) {
verifierReceiver(messageVerifier);
return this.delegate;
}
@@ -326,12 +335,20 @@ public class StubRunnerExtension implements BeforeAllCallback, AfterAllCallback,
return this.delegate.stubRunnerOptionsBuilder;
}
MessageVerifier verifier() {
return this.delegate.verifier;
MessageVerifierSender verifierSender() {
return this.delegate.verifierSender;
}
void verifier(MessageVerifier verifier) {
this.delegate.verifier = verifier;
MessageVerifierReceiver verifierReceiver() {
return this.delegate.verifierReceiver;
}
void verifierSender(MessageVerifierSender verifier) {
this.delegate.verifierSender = verifier;
}
void verifierReceiver(MessageVerifierReceiver verifier) {
this.delegate.verifierReceiver = verifier;
}
/**

View File

@@ -22,7 +22,8 @@ import java.util.Map;
import org.springframework.cloud.contract.stubrunner.HttpServerStubConfigurer;
import org.springframework.cloud.contract.stubrunner.StubRunnerOptions;
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
/**
* @author Olga Maciaszek-Sharma
@@ -31,13 +32,22 @@ import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
interface StubRunnerExtensionOptions {
/**
* Pass the {@link MessageVerifier} that this rule should use. If you don't pass
* Pass the {@link MessageVerifierSender} that this rule should use. If you don't pass
* anything a {@link ExceptionThrowingMessageVerifier} will be used. That means that
* an exception will be thrown whenever you try to do sth messaging related.
* @param messageVerifier message verifier implementation
* @return the stub runner extension
*/
StubRunnerExtension messageVerifier(MessageVerifier messageVerifier);
StubRunnerExtension messageVerifierSender(MessageVerifierSender messageVerifier);
/**
* Pass the {@link MessageVerifierReceiver} that this rule should use. If you don't
* pass anything a {@link ExceptionThrowingMessageVerifier} will be used. That means
* that an exception will be thrown whenever you try to do sth messaging related.
* @param messageVerifier message verifier implementation
* @return the stub runner extension
*/
StubRunnerExtension messageVerifierReceiver(MessageVerifierReceiver messageVerifier);
/**
* Override all options.

View File

@@ -36,7 +36,8 @@ import org.springframework.cloud.contract.stubrunner.StubFinder;
import org.springframework.cloud.contract.stubrunner.StubRunnerOptions;
import org.springframework.cloud.contract.stubrunner.StubRunnerOptionsBuilder;
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
/**
* JUnit class rule that allows you to download the provided stubs.
@@ -54,7 +55,9 @@ public class StubRunnerRule implements TestRule, StubFinder, StubRunnerRuleOptio
BatchStubRunner stubFinder;
MessageVerifier verifier = new ExceptionThrowingMessageVerifier();
MessageVerifierSender verifierSender = new ExceptionThrowingMessageVerifier();
MessageVerifierReceiver verifierReceiver = new ExceptionThrowingMessageVerifier();
StubRunnerRule delegate = this;
@@ -76,14 +79,20 @@ public class StubRunnerRule implements TestRule, StubFinder, StubRunnerRuleOptio
}
private void before() {
stubFinder(new BatchStubRunnerFactory(builder().build(), verifier()).buildBatchStubRunner());
stubFinder(new BatchStubRunnerFactory(builder().build(), verifierSender()).buildBatchStubRunner());
StubRunnerRule.this.stubFinder().runStubs();
}
};
}
@Override
public StubRunnerRule messageVerifier(MessageVerifier messageVerifier) {
public StubRunnerRule messageVerifierSender(MessageVerifierSender messageVerifier) {
verifier(messageVerifier);
return this.delegate;
}
@Override
public StubRunnerRule messageVerifierReceiver(MessageVerifierReceiver messageVerifier) {
verifier(messageVerifier);
return this.delegate;
}
@@ -270,12 +279,20 @@ public class StubRunnerRule implements TestRule, StubFinder, StubRunnerRuleOptio
this.delegate.stubFinder = stubFinder;
}
MessageVerifier verifier() {
return this.delegate.verifier;
MessageVerifierSender verifierSender() {
return this.delegate.verifierSender;
}
void verifier(MessageVerifier verifier) {
this.delegate.verifier = verifier;
MessageVerifierReceiver verifierReceiver() {
return this.delegate.verifierReceiver;
}
void verifier(MessageVerifierSender verifier) {
this.delegate.verifierSender = verifier;
}
void verifier(MessageVerifierReceiver verifier) {
this.delegate.verifierReceiver = verifier;
}
StubRunnerOptionsBuilder builder() {

View File

@@ -22,18 +22,28 @@ import java.util.Map;
import org.springframework.cloud.contract.stubrunner.HttpServerStubConfigurer;
import org.springframework.cloud.contract.stubrunner.StubRunnerOptions;
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
interface StubRunnerRuleOptions {
/**
* Pass the {@link MessageVerifier} that this rule should use. If you don't pass
* Pass the {@link MessageVerifierSender} that this rule should use. If you don't pass
* anything a {@link ExceptionThrowingMessageVerifier} will be used. That means that
* an exception will be thrown whenever you try to do sth messaging related.
* @param messageVerifier message verifier implementation
* @return the rule
*/
StubRunnerRule messageVerifier(MessageVerifier messageVerifier);
StubRunnerRule messageVerifierSender(MessageVerifierSender messageVerifier);
/**
* Pass the {@link MessageVerifierReceiver} that this rule should use. If you don't
* pass anything a {@link ExceptionThrowingMessageVerifier} will be used. That means
* that an exception will be thrown whenever you try to do sth messaging related.
* @param messageVerifier message verifier implementation
* @return the rule
*/
StubRunnerRule messageVerifierReceiver(MessageVerifierReceiver messageVerifier);
/**
* Override all options.

View File

@@ -34,7 +34,6 @@ import org.springframework.cloud.contract.stubrunner.StubDownloaderBuilderProvid
import org.springframework.cloud.contract.stubrunner.StubRunnerOptions;
import org.springframework.cloud.contract.stubrunner.StubRunnerOptionsBuilder;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
import org.springframework.cloud.contract.verifier.messaging.noop.NoOpStubMessages;
@@ -158,7 +157,7 @@ public class StubRunnerConfiguration {
}
@SuppressWarnings("unchecked")
class LazyMessageVerifier implements MessageVerifier {
class LazyMessageVerifier implements MessageVerifierSender, MessageVerifierReceiver {
private MessageVerifierSender<?> messageVerifierSender;

View File

@@ -23,7 +23,8 @@ import spock.lang.Specification
import org.springframework.cloud.contract.stubrunner.util.StubsParser
import org.springframework.cloud.contract.verifier.converter.YamlContract
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender
import org.springframework.cloud.test.TestSocketUtils
class StubRunnerExecutorSpec extends Specification {
@@ -164,7 +165,7 @@ class StubRunnerExecutorSpec extends Specification {
executor.shutdown()
}
class MockMessageVerifier implements MessageVerifier {
class MockMessageVerifier implements MessageVerifierSender, MessageVerifierReceiver {
boolean called
@@ -199,7 +200,7 @@ class StubRunnerExecutorSpec extends Specification {
}
}
private class AssertingStubMessages implements MessageVerifier<Object> {
private class AssertingStubMessages implements MessageVerifierSender<Object>, MessageVerifierReceiver<Object> {
@Override
void send(Object message, String destination, YamlContract contract) {

View File

@@ -27,8 +27,8 @@ import spock.lang.Specification
import org.springframework.cloud.contract.stubrunner.junit.StubRunnerRule
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties
import org.springframework.cloud.contract.verifier.converter.YamlContract
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender
/**
* @author Marcin Grzejszczak
*/
@@ -47,7 +47,8 @@ class StubRunnerRuleCustomMsgVerifierSpec extends Specification {
.stubsMode(StubRunnerProperties.StubsMode.REMOTE)
.repoRoot(StubRunnerRuleCustomMsgVerifierSpec.getResource("/m2repo/repository").toURI().toString())
.downloadStub("org.springframework.cloud.contract.verifier.stubs", "bootService")
.messageVerifier(new MyMessageVerifier())
.messageVerifierSender(new MyMessageVerifier())
.messageVerifierReceiver(new MyMessageVerifier())
def 'should use the provided message verifier in the junit rule'() {
when:
@@ -67,7 +68,7 @@ class StubRunnerRuleCustomMsgVerifierSpec extends Specification {
e.message.contains("Failed to send a message with headers")
}
static class MyMessageVerifier implements MessageVerifier {
static class MyMessageVerifier implements MessageVerifierSender, MessageVerifierReceiver {
@Override
void send(Object message, String destination, YamlContract contract) {

View File

@@ -29,7 +29,8 @@ import org.springframework.boot.test.web.client.TestRestTemplate
import org.springframework.cloud.contract.stubrunner.StubFinder
import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender
import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@@ -37,7 +38,6 @@ import org.springframework.core.env.Environment
import org.springframework.http.ResponseEntity
import org.springframework.messaging.Message
import org.springframework.test.context.ActiveProfiles
/**
* @author Marcin Grzejszczak
*/
@@ -56,7 +56,7 @@ class StubRunnerStubsPerConsumerSpec {
@Autowired
Environment environment
@Autowired
MessageVerifier<Message<?>> messaging
MessageVerifierReceiver<Message<?>> messaging
TestRestTemplate template = new TestRestTemplate()
@Test

View File

@@ -20,7 +20,6 @@ import java.util.function.Function
import org.assertj.core.api.BDDAssertions
import org.junit.jupiter.api.Test
import spock.lang.Specification
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
@@ -30,7 +29,7 @@ import org.springframework.boot.test.web.client.TestRestTemplate
import org.springframework.cloud.contract.stubrunner.StubFinder
import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver
import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@@ -57,7 +56,7 @@ class StubRunnerStubsPerConsumerWithConsumerNameSpec {
@Autowired
Environment environment
@Autowired
MessageVerifier<Message<?>> messaging
MessageVerifierReceiver<Message<?>> messaging
TestRestTemplate template = new TestRestTemplate()

View File

@@ -27,7 +27,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.springframework.cloud.contract.stubrunner.junit4.StubRunnerRuleCustomPortJUnitTest;
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -43,7 +44,7 @@ class StubRunnerJUnit5ExtensionCustomMessageVerifierTests {
static StubRunnerExtension stubRunnerExtension = new StubRunnerExtension()
.stubsMode(StubRunnerProperties.StubsMode.REMOTE).repoRoot(repoRoot())
.downloadStub("org.springframework.cloud.contract.verifier.stubs", "bootService")
.messageVerifier(new MyMessageVerifier());
.messageVerifierSender(new MyMessageVerifier()).messageVerifierReceiver(new MyMessageVerifier());
@BeforeAll
@AfterAll
@@ -74,7 +75,7 @@ class StubRunnerJUnit5ExtensionCustomMessageVerifierTests {
assertThat(wrongLabelWithIvyNotation.getMessage()).contains("Failed to send a message with headers");
}
static class MyMessageVerifier implements MessageVerifier {
static class MyMessageVerifier implements MessageVerifierSender, MessageVerifierReceiver {
@Override
public void send(Object message, String destination, YamlContract contract) {

View File

@@ -1,31 +0,0 @@
/*
* Copyright 2013-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.cloud.contract.verifier.messaging;
/**
* Core interface that allows you to build, send and receive messages.
*
* Destination is relevant to the underlying implementation. Might be a channel, queue,
* topic etc.
*
* @param <M> message type
* @author Marcin Grzejszczak
* @since 1.0.0
*/
public interface MessageVerifier<M> extends MessageVerifierSender<M>, MessageVerifierReceiver<M> {
}

View File

@@ -29,14 +29,15 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessageMetadata;
import org.springframework.util.StringUtils;
/**
* @author Marcin Grzejszczak
*/
public class CamelStubMessages implements MessageVerifier<Message> {
public class CamelStubMessages implements MessageVerifierSender<Message>, MessageVerifierReceiver<Message> {
private static final Logger log = LoggerFactory.getLogger(CamelStubMessages.class);

View File

@@ -50,7 +50,8 @@ public class ContractVerifierIntegrationConfiguration {
@ConditionalOnMissingBean(MessageVerifierSender.class)
public MessageVerifierSender<Message<?>> integrationContractVerifierMessageSender(
ApplicationContext applicationContext) {
SpringIntegrationStubMessages springIntegrationStubMessages = new SpringIntegrationStubMessages(applicationContext);
SpringIntegrationStubMessages springIntegrationStubMessages = new SpringIntegrationStubMessages(
applicationContext);
return new MessageVerifierSender<>() {
@Override
public void send(Message<?> message, String destination, @Nullable YamlContract contract) {
@@ -58,7 +59,8 @@ public class ContractVerifierIntegrationConfiguration {
}
@Override
public <T> void send(T payload, Map<String, Object> headers, String destination, @Nullable YamlContract contract) {
public <T> void send(T payload, Map<String, Object> headers, String destination,
@Nullable YamlContract contract) {
springIntegrationStubMessages.send(payload, headers, destination, contract);
}
};
@@ -68,10 +70,12 @@ public class ContractVerifierIntegrationConfiguration {
@ConditionalOnMissingBean(MessageVerifierReceiver.class)
public MessageVerifierReceiver<Message<?>> integrationContractVerifierMessageReceiver(
ApplicationContext applicationContext) {
SpringIntegrationStubMessages springIntegrationStubMessages = new SpringIntegrationStubMessages(applicationContext);
SpringIntegrationStubMessages springIntegrationStubMessages = new SpringIntegrationStubMessages(
applicationContext);
return new MessageVerifierReceiver<>() {
@Override
public Message<?> receive(String destination, long timeout, TimeUnit timeUnit, @Nullable YamlContract contract) {
public Message<?> receive(String destination, long timeout, TimeUnit timeUnit,
@Nullable YamlContract contract) {
return springIntegrationStubMessages.receive(destination, timeout, timeUnit, contract);
}

View File

@@ -23,7 +23,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.context.ApplicationContext;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
@@ -32,7 +31,9 @@ import org.springframework.messaging.PollableChannel;
/**
* @author Marcin Grzejszczak
*/
public class SpringIntegrationStubMessages implements MessageVerifier<Message<?>> {
public class SpringIntegrationStubMessages
implements org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender<Message<?>>,
org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver<Message<?>> {
private static final Log log = LogFactory.getLog(SpringIntegrationStubMessages.class);

View File

@@ -24,14 +24,13 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
/**
* Wrapper around messaging. Abstracts all message related operations like sending,
* converting and receiving. Delegates the actual work to an implementation of a
* {@link MessageVerifier}.
* {@link MessageVerifierSender} and {@link MessageVerifierReceiver}.
*
* @param <M> message type
* @author Dave Syer

View File

@@ -67,7 +67,8 @@ public class ContractVerifierJmsConfiguration {
}
@Override
public <T> void send(T payload, Map<String, Object> headers, String destination, @Nullable YamlContract contract) {
public <T> void send(T payload, Map<String, Object> headers, String destination,
@Nullable YamlContract contract) {
jmsStubMessages.send(payload, headers, destination, contract);
}
};
@@ -81,7 +82,8 @@ public class ContractVerifierJmsConfiguration {
JmsStubMessages jmsStubMessages = new JmsStubMessages(jmsTemplate);
return new MessageVerifierReceiver<>() {
@Override
public Message receive(String destination, long timeout, TimeUnit timeUnit, @Nullable YamlContract contract) {
public Message receive(String destination, long timeout, TimeUnit timeUnit,
@Nullable YamlContract contract) {
return jmsStubMessages.receive(destination, timeout, timeUnit, contract);
}

View File

@@ -27,11 +27,11 @@ import jakarta.jms.Message;
import jakarta.jms.Session;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessagePostProcessor;
class JmsStubMessages implements MessageVerifier<Message> {
class JmsStubMessages implements org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender<Message>,
org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver<Message> {
private final JmsTemplate jmsTemplate;

View File

@@ -55,7 +55,8 @@ public class NoOpContractVerifierAutoConfiguration {
}
@Override
public <T> void send(T payload, Map<String, Object> headers, String destination, @Nullable YamlContract contract) {
public <T> void send(T payload, Map<String, Object> headers, String destination,
@Nullable YamlContract contract) {
noOpStubMessages.send(payload, headers, destination, contract);
}
};
@@ -68,7 +69,8 @@ public class NoOpContractVerifierAutoConfiguration {
return new MessageVerifierReceiver<>() {
@Override
public Object receive(String destination, long timeout, TimeUnit timeUnit, @Nullable YamlContract contract) {
public Object receive(String destination, long timeout, TimeUnit timeUnit,
@Nullable YamlContract contract) {
return noOpStubMessages.receive(destination, timeout, timeUnit, contract);
}

View File

@@ -20,12 +20,13 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
/**
* @author Marcin Grzejszczak
*/
public class NoOpStubMessages<U> implements MessageVerifier<U> {
public class NoOpStubMessages<U>
implements org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender<U>,
org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver<U> {
@Override
public void send(U message, String destination, YamlContract contract) {

View File

@@ -72,7 +72,8 @@ public class ContractVerifierStreamAutoConfiguration {
}
@Override
public <T> void send(T payload, Map<String, Object> headers, String destination, @Nullable YamlContract contract) {
public <T> void send(T payload, Map<String, Object> headers, String destination,
@Nullable YamlContract contract) {
stubMessages.send(payload, headers, destination, contract);
}
};
@@ -86,7 +87,8 @@ public class ContractVerifierStreamAutoConfiguration {
new StreamOutputDestinationMessageReceiver(context));
return new MessageVerifierReceiver<>() {
@Override
public Message<?> receive(String destination, long timeout, TimeUnit timeUnit, @Nullable YamlContract contract) {
public Message<?> receive(String destination, long timeout, TimeUnit timeUnit,
@Nullable YamlContract contract) {
return stubMessages.receive(destination, timeout, timeUnit, contract);
}

View File

@@ -20,7 +20,6 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.springframework.cloud.contract.verifier.converter.YamlContract;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierReceiver;
import org.springframework.cloud.contract.verifier.messaging.MessageVerifierSender;
import org.springframework.messaging.Message;
@@ -28,7 +27,7 @@ import org.springframework.messaging.Message;
/**
* @author Marcin Grzejszczak
*/
public class StreamStubMessages implements MessageVerifier<Message<?>> {
public class StreamStubMessages implements MessageVerifierSender<Message<?>>, MessageVerifierReceiver<Message<?>> {
private final MessageVerifierSender<Message<?>> sender;

View File

@@ -21,7 +21,6 @@ import javax.inject.Inject
import com.jayway.jsonpath.DocumentContext
import com.jayway.jsonpath.JsonPath
import com.toomuchcoding.jsonassert.JsonAssertion
import org.apache.camel.Message
import org.apache.camel.model.ModelCamelContext
import org.junit.jupiter.api.Test
import org.testcontainers.containers.RabbitMQContainer
@@ -31,8 +30,8 @@ import org.testcontainers.junit.jupiter.Testcontainers
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper
import org.springframework.test.context.DynamicPropertyRegistry
import org.springframework.test.context.DynamicPropertySource
@@ -49,7 +48,7 @@ class CamelMessagingApplicationSpec {
@Autowired
ModelCamelContext camelContext
@Inject
MessageVerifier<Message> contractVerifierMessaging
ContractVerifierMessaging contractVerifierMessaging
ContractVerifierObjectMapper contractVerifierObjectMapper = new ContractVerifierObjectMapper()
@@ -87,7 +86,7 @@ class CamelMessagingApplicationSpec {
assert response.headers.get('BOOK-NAME') == 'foo'
and:
DocumentContext parsedJson = JsonPath.
parse(contractVerifierObjectMapper.writeValueAsString(response.body))
parse(contractVerifierObjectMapper.writeValueAsString(response.getPayload()))
JsonAssertion.assertThat(parsedJson).field('bookName').isEqualTo('foo')
}

View File

@@ -22,13 +22,12 @@ import com.jayway.jsonpath.DocumentContext
import com.jayway.jsonpath.JsonPath
import com.toomuchcoding.jsonassert.JsonAssertion
import org.junit.jupiter.api.Test
import spock.lang.Specification
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper
import org.springframework.messaging.Message
@@ -39,7 +38,7 @@ class IntegrationMessagingApplicationSpec {
// ALL CASES
@Inject
MessageVerifier<Message<?>> contractVerifierMessaging
ContractVerifierMessaging<Message<?>> contractVerifierMessaging
ContractVerifierObjectMapper contractVerifierObjectMapper = new ContractVerifierObjectMapper()
@Test

View File

@@ -23,22 +23,18 @@ import com.jayway.jsonpath.JsonPath
import com.toomuchcoding.jsonassert.JsonAssertion
import jakarta.jms.JMSException
import jakarta.jms.Message
import org.awaitility.Awaitility
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper
import org.springframework.jms.core.JmsTemplate
import org.springframework.jms.core.MessagePostProcessor
import org.springframework.test.annotation.DirtiesContext
/**
* SPIKE ON TESTS FROM NOTES IN MessagingSpec
*/
@@ -51,8 +47,6 @@ class JmsMessagingApplicationSpec {
@Autowired
JmsTemplate jmsTemplate
@Inject
MessageVerifier<Message> messageVerifier
@Inject
ContractVerifierMessaging contractVerifierMessaging
@Inject
ContractVerifierObjectMapper contractVerifierObjectMapper

View File

@@ -32,7 +32,7 @@ import org.springframework.boot.test.context.SpringBootTest
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.stubrunner.StubFinder
import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner
import org.springframework.cloud.contract.verifier.messaging.integration.SpringIntegrationStubMessages
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.ImportResource
@@ -49,7 +49,7 @@ class IntegrationStubRunnerSpec {
@Autowired
StubFinder stubFinder
@Autowired
SpringIntegrationStubMessages messaging
ContractVerifierMessaging messaging
@BeforeEach
void setup() {

View File

@@ -16,7 +16,6 @@
package org.springframework.cloud.contract.stubrunner.messaging.stream
import java.util.function.Function
import groovy.json.JsonOutput
@@ -33,8 +32,8 @@ import org.springframework.boot.test.context.SpringBootTest
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.stubrunner.StubFinder
import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner
import org.springframework.cloud.contract.verifier.messaging.MessageVerifier
import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier
import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging
import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@@ -53,7 +52,7 @@ class StreamStubRunnerSpec {
@Autowired
StubFinder stubFinder
@Autowired
MessageVerifier<Message<?>> messaging
ContractVerifierMessaging<Message<?>> messaging
@Test
void 'should trigger a message by label'() {