refactored message pact examples

This commit is contained in:
Tom Hombergs
2018-09-13 06:24:27 +02:00
parent b4bec09a3e
commit de7fa53d55
25 changed files with 63 additions and 61 deletions

View File

@@ -13,13 +13,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserCreatedMessageConsumer {
public class MessageConsumer {
private Logger logger = LoggerFactory.getLogger(UserCreatedMessageConsumer.class);
private Logger logger = LoggerFactory.getLogger(MessageConsumer.class);
private ObjectMapper objectMapper;
public UserCreatedMessageConsumer(ObjectMapper objectMapper) {
public MessageConsumer(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}

View File

@@ -47,13 +47,13 @@ public class MessageConsumerConfiguration {
}
@Bean
public MessageListenerAdapter listenerAdapter(UserCreatedMessageConsumer userCreatedMessageConsumer) {
return new MessageListenerAdapter(userCreatedMessageConsumer, "consumeStringMessage");
public MessageListenerAdapter listenerAdapter(MessageConsumer messageConsumer) {
return new MessageListenerAdapter(messageConsumer, "consumeStringMessage");
}
@Bean
public UserCreatedMessageConsumer eventReceiver(ObjectMapper objectMapper) {
return new UserCreatedMessageConsumer(objectMapper);
public MessageConsumer eventReceiver(ObjectMapper objectMapper) {
return new MessageConsumer(objectMapper);
}
}

View File

@@ -17,14 +17,14 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserCreatedMessageConsumerTest {
public class MessageConsumerTest {
@Rule
public MessagePactProviderRule mockProvider = new MessagePactProviderRule(this);
private byte[] currentMessage;
@Autowired
private UserCreatedMessageConsumer userCreatedMessageConsumer;
private MessageConsumer messageConsumer;
@Pact(provider = "userservice", consumer = "userclient")
public MessagePact userCreatedMessagePact(MessagePactBuilder builder) {
@@ -46,7 +46,7 @@ public class UserCreatedMessageConsumerTest {
@Test
@PactVerification("userCreatedMessagePact")
public void verifyCreatePersonPact() throws IOException {
userCreatedMessageConsumer.consumeStringMessage(new String(this.currentMessage));
messageConsumer.consumeStringMessage(new String(this.currentMessage));
}
/**

View File

@@ -0,0 +1,31 @@
package io.reflectoring;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Takes a {@link UserCreatedMessage}, converts it to a {@link String} and sends it to be published.
*/
class MessageProducer {
private Logger logger = LoggerFactory.getLogger(MessageProducer.class);
private ObjectMapper objectMapper;
private MessagePublisher messagePublisher;
MessageProducer(ObjectMapper objectMapper, MessagePublisher messagePublisher) {
this.objectMapper = objectMapper;
this.messagePublisher = messagePublisher;
}
void produceUserCreatedMessage(UserCreatedMessage message) throws IOException {
String stringMessage = objectMapper.writeValueAsString(message);
messagePublisher.publishMessage(stringMessage, "user.created");
logger.info("Published message '{}'", stringMessage);
}
}

View File

@@ -18,18 +18,18 @@ class MessageProviderConfiguration {
@Bean
UserCreatedMessageProvider messageProvider(ObjectMapper objectMapper, UserCreatedMessagePublisher publisher) {
return new UserCreatedMessageProvider(objectMapper, publisher);
MessageProducer messageProvider(ObjectMapper objectMapper, MessagePublisher publisher) {
return new MessageProducer(objectMapper, publisher);
}
@Bean
UserCreatedMessagePublisher messagePublisher(RabbitTemplate rabbitTemplate, TopicExchange topicExchange) {
return new UserCreatedMessagePublisher(rabbitTemplate, topicExchange);
MessagePublisher messagePublisher(RabbitTemplate rabbitTemplate, TopicExchange topicExchange) {
return new MessagePublisher(rabbitTemplate, topicExchange);
}
@Bean
SendMessageJob job(UserCreatedMessageProvider messageProvider) {
return new SendMessageJob(messageProvider);
SendMessageJob job(MessageProducer messageProducer) {
return new SendMessageJob(messageProducer);
}

View File

@@ -6,13 +6,13 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
/**
* Publishes a String message to RabbitMQ.
*/
class UserCreatedMessagePublisher {
class MessagePublisher {
private RabbitTemplate rabbitTemplate;
private TopicExchange topicExchange;
UserCreatedMessagePublisher(RabbitTemplate rabbitTemplate, TopicExchange topicExchange) {
MessagePublisher(RabbitTemplate rabbitTemplate, TopicExchange topicExchange) {
this.rabbitTemplate = rabbitTemplate;
this.topicExchange = topicExchange;
}

View File

@@ -10,10 +10,10 @@ class SendMessageJob {
private Random random = new Random();
private UserCreatedMessageProvider messageProvider;
private MessageProducer messageProducer;
SendMessageJob(UserCreatedMessageProvider messageProvider) {
this.messageProvider = messageProvider;
SendMessageJob(MessageProducer messageProducer) {
this.messageProducer = messageProducer;
}
/**
@@ -29,7 +29,7 @@ class SendMessageJob {
.name("Zaphpod Beeblebrox")
.build())
.build();
messageProvider.sendUserCreatedMessage(userCreatedMessage);
messageProducer.produceUserCreatedMessage(userCreatedMessage);
} catch (IOException e) {
throw new RuntimeException(e);
}

View File

@@ -10,6 +10,12 @@ import au.com.dius.pact.provider.ProviderVerifier;
import au.com.dius.pact.provider.junit.target.AmqpTarget;
import org.jetbrains.annotations.NotNull;
/**
* Custom implementation of {@link AmqpTarget} since with {@link AmqpTarget}
* I had classpath troubles (see https://github.com/DiUS/pact-jvm/issues/763).
* Use at own risk, since the implementation is not complete and may behave
* a little different that the original class.
*/
public class CustomAmqpTarget extends AmqpTarget {
public CustomAmqpTarget(List<String> packagesToScan) {

View File

@@ -8,16 +8,12 @@ import au.com.dius.pact.provider.PactVerifyProvider;
import au.com.dius.pact.provider.junit.PactRunner;
import au.com.dius.pact.provider.junit.Provider;
import au.com.dius.pact.provider.junit.loader.PactFolder;
import au.com.dius.pact.provider.junit.target.AmqpTarget;
import au.com.dius.pact.provider.junit.target.Target;
import au.com.dius.pact.provider.junit.target.TestTarget;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.mockito.Mockito.*;
@RunWith(PactRunner.class)
@@ -28,9 +24,9 @@ public class UserCreatedMessageProviderTest {
@TestTarget
public final Target target = new CustomAmqpTarget(Collections.singletonList("io.reflectoring"));
private UserCreatedMessagePublisher publisher = Mockito.mock(UserCreatedMessagePublisher.class);
private MessagePublisher publisher = Mockito.mock(MessagePublisher.class);
private UserCreatedMessageProvider messageProvider = new UserCreatedMessageProvider(new ObjectMapper(), publisher);
private MessageProducer messageProducer = new MessageProducer(new ObjectMapper(), publisher);
@PactVerifyProvider("a user created message")
public String verifyUserCreatedMessage() throws IOException {
@@ -45,7 +41,7 @@ public class UserCreatedMessageProviderTest {
.name("Zaphod Beeblebrox")
.build())
.build();
messageProvider.sendUserCreatedMessage(message);
messageProducer.produceUserCreatedMessage(message);
// then
ArgumentCaptor<String> messageCapture = ArgumentCaptor.forClass(String.class);

View File

@@ -1,31 +0,0 @@
package io.reflectoring;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Takes a {@link UserCreatedMessage}, converts it to a {@link String} and sends it to be published.
*/
class UserCreatedMessageProvider {
private Logger logger = LoggerFactory.getLogger(UserCreatedMessageProvider.class);
private ObjectMapper objectMapper;
private UserCreatedMessagePublisher userCreatedMessagePublisher;
UserCreatedMessageProvider(ObjectMapper objectMapper, UserCreatedMessagePublisher userCreatedMessagePublisher) {
this.objectMapper = objectMapper;
this.userCreatedMessagePublisher = userCreatedMessagePublisher;
}
void sendUserCreatedMessage(UserCreatedMessage message) throws IOException {
String stringMessage = objectMapper.writeValueAsString(message);
userCreatedMessagePublisher.publishMessage(stringMessage, "user.created");
logger.info("Published message '{}'", stringMessage);
}
}

View File

@@ -10,7 +10,7 @@ include 'spring-cloud:spring-cloud-contract-consumer'
include 'pact:pact-spring-provider'
include 'pact:pact-feign-consumer'
include 'pact:pact-message-consumer'
include 'pact:pact-message-provider'
include 'pact:pact-message-producer'
include 'spring-boot:rabbitmq-event-brokering'