From 7242649f9cafd7c1b4e7d2777c849678e8d0a501 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 11 Oct 2017 12:33:13 +0200 Subject: [PATCH] Almost there --- .../server/StubRunnerBootSpec.groovy | 10 ++--- .../StubRunnerStubsPerConsumerSpec.groovy | 4 +- ...tubsPerConsumerWithConsumerNameSpec.groovy | 5 +-- .../messaging/stream/StreamStubMessages.java | 37 +++++++++++++++++-- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/server/StubRunnerBootSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/server/StubRunnerBootSpec.groovy index 9486505b2a..c436dfc803 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/server/StubRunnerBootSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/server/StubRunnerBootSpec.groovy @@ -16,9 +16,9 @@ package org.springframework.cloud.contract.stubrunner.server -import io.restassured.module.mockmvc.RestAssuredMockMvc import groovy.json.JsonSlurper -import org.junit.Ignore +import io.restassured.module.mockmvc.RestAssuredMockMvc +import spock.lang.Specification import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootContextLoader @@ -26,13 +26,9 @@ import org.springframework.boot.test.context.SpringBootTest import org.springframework.cloud.contract.stubrunner.StubRunning import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ContextConfiguration -import spock.lang.Specification - /** * @author Marcin Grzejszczak */ -// TODO: Boot 2.0 -@Ignore // tag::boot_usage[] @ContextConfiguration(classes = StubRunnerBoot, loader = SpringBootContextLoader) @SpringBootTest(properties = "spring.cloud.zookeeper.enabled=false") @@ -59,7 +55,7 @@ class StubRunnerBootSpec extends Specification { def response = RestAssuredMockMvc.get("/stubs/${stubId}") then: response.statusCode == 200 - response.body.as(Integer) > 0 + Integer.valueOf(response.body.asString()) > 0 where: stubId << ['org.springframework.cloud.contract.verifier.stubs:bootService:+:stubs', 'org.springframework.cloud.contract.verifier.stubs:bootService:0.0.1-SNAPSHOT:stubs', diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy index 0722eea0b5..272920c915 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy @@ -26,7 +26,6 @@ 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.verifier.messaging.MessageVerifier -import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper import org.springframework.cloud.stream.annotation.EnableBinding import org.springframework.cloud.stream.messaging.Sink import org.springframework.context.annotation.Configuration @@ -35,7 +34,6 @@ import org.springframework.http.ResponseEntity import org.springframework.messaging.Message import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration - /** * @author Marcin Grzejszczak */ @@ -74,7 +72,7 @@ class StubRunnerStubsPerConsumerSpec extends Specification { Message receivedMessage = messaging.receive('output') and: receivedMessage != null - new ContractVerifierObjectMapper().writeValueAsString(receivedMessage.payload) == "\"{\\\"bookName\\\":\\\"foo_for_bar\\\"}\"" + receivedMessage.payload == '''{"bookName":"foo_for_bar"}''' receivedMessage.headers.get('BOOK-NAME') == 'foo_for_bar' } diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy index 8215a8dcc4..eb61c7b1bf 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy @@ -26,7 +26,6 @@ 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.verifier.messaging.MessageVerifier -import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper import org.springframework.cloud.stream.annotation.EnableBinding import org.springframework.cloud.stream.messaging.Sink import org.springframework.context.annotation.Configuration @@ -71,10 +70,10 @@ class StubRunnerStubsPerConsumerWithConsumerNameSpec extends Specification { when: stubFinder.trigger('return_book_for_foo') then: - Message receivedMessage = messaging.receive('output') + Message receivedMessage = messaging.receive('output') and: receivedMessage != null - new ContractVerifierObjectMapper().writeValueAsString(receivedMessage.payload) == "\"{\\\"bookName\\\":\\\"foo_for_foo\\\"}\"" + receivedMessage.payload == '''{"bookName":"foo_for_foo"}''' receivedMessage.headers.get('BOOK-NAME') == 'foo_for_foo' } diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java index 00cebd3016..d70e5f0831 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java @@ -19,9 +19,10 @@ package org.springframework.cloud.contract.verifier.messaging.stream; import java.util.Map; import java.util.concurrent.TimeUnit; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.cloud.contract.verifier.messaging.MessageVerifier; import org.springframework.cloud.stream.config.BindingProperties; import org.springframework.cloud.stream.config.BindingServiceProperties; @@ -29,6 +30,10 @@ import org.springframework.cloud.stream.test.binder.MessageCollector; import org.springframework.context.ApplicationContext; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.converter.DefaultContentTypeResolver; +import org.springframework.messaging.converter.MappingJackson2MessageConverter; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.util.MimeTypeUtils; /** * @author Marcin Grzejszczak @@ -41,7 +46,6 @@ public class StreamStubMessages implements MessageVerifier> { private final MessageCollector messageCollector; private final ContractVerifierStreamMessageBuilder builder = new ContractVerifierStreamMessageBuilder(); - @Autowired public StreamStubMessages(ApplicationContext context) { this.context = context; this.messageCollector = context.getBean(MessageCollector.class); @@ -71,7 +75,12 @@ public class StreamStubMessages implements MessageVerifier> { try { MessageChannel messageChannel = this.context .getBean(resolvedDestination(destination), MessageChannel.class); - return this.messageCollector.forChannel(messageChannel).poll(timeout, timeUnit); + Message message = this.messageCollector.forChannel(messageChannel).poll(timeout, timeUnit); + if (message == null) { + return message; + } + Object fromMessage = converter().fromMessage(message, String.class); + return MessageBuilder.createMessage(fromMessage, message.getHeaders()); } catch (Exception e) { log.error("Exception occurred while trying to read a message from " @@ -110,4 +119,26 @@ public class StreamStubMessages implements MessageVerifier> { return receive(destination, 5, TimeUnit.SECONDS); } + private MappingJackson2MessageConverter converter() { + ObjectMapper mapper = null; + try { + mapper = this.context.getBean(ObjectMapper.class); + } catch (NoSuchBeanDefinitionException e) { + + } + MappingJackson2MessageConverter converter = createJacksonConverter(); + if (mapper != null) { + converter.setObjectMapper(mapper); + } + return converter; + } + + protected MappingJackson2MessageConverter createJacksonConverter() { + DefaultContentTypeResolver resolver = new DefaultContentTypeResolver(); + resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON); + MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); + converter.setContentTypeResolver(resolver); + return converter; + } + }