Skip to content

Commit a18ad84

Browse files
committed
working (but awkward) example of a message provider test
1 parent 5e93dcb commit a18ad84

File tree

4 files changed

+102
-26
lines changed

4 files changed

+102
-26
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.reflectoring;
2+
3+
import java.util.List;
4+
5+
import au.com.dius.pact.model.Interaction;
6+
import au.com.dius.pact.model.ProviderState;
7+
import au.com.dius.pact.provider.ConsumerInfo;
8+
import au.com.dius.pact.provider.ProviderInfo;
9+
import au.com.dius.pact.provider.ProviderVerifier;
10+
import au.com.dius.pact.provider.junit.target.AmqpTarget;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
public class CustomAmqpTarget extends AmqpTarget {
14+
15+
public CustomAmqpTarget(List<String> packagesToScan) {
16+
super(packagesToScan);
17+
}
18+
19+
@NotNull
20+
@Override
21+
protected ProviderVerifier setupVerifier(Interaction interaction, ProviderInfo provider, ConsumerInfo consumer) {
22+
ProviderVerifier verifier = new CustomProviderVerifier(getPackagesToScan());
23+
setupReporters(verifier, provider.getName(), interaction.getDescription());
24+
verifier.initialiseReporters(provider);
25+
verifier.reportVerificationForConsumer(consumer, provider);
26+
27+
if (!interaction.getProviderStates().isEmpty()) {
28+
for (ProviderState state : interaction.getProviderStates()) {
29+
verifier.reportStateForInteraction(state.getName(), provider, consumer, true);
30+
}
31+
}
32+
verifier.reportInteractionDescription(interaction);
33+
return verifier;
34+
}
35+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.reflectoring;
2+
3+
import java.lang.reflect.Method;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.Set;
7+
import java.util.stream.Collectors;
8+
9+
import au.com.dius.pact.model.Interaction;
10+
import au.com.dius.pact.model.v3.messaging.Message;
11+
import au.com.dius.pact.provider.ConsumerInfo;
12+
import au.com.dius.pact.provider.PactVerifyProvider;
13+
import au.com.dius.pact.provider.ProviderInfo;
14+
import au.com.dius.pact.provider.ProviderVerifier;
15+
import org.reflections.Reflections;
16+
import org.reflections.scanners.MethodAnnotationsScanner;
17+
import org.reflections.util.ConfigurationBuilder;
18+
19+
public class CustomProviderVerifier extends ProviderVerifier {
20+
21+
private List<String> packagesToScan;
22+
23+
public CustomProviderVerifier(List<String> packagesToScan) {
24+
this.packagesToScan = packagesToScan;
25+
}
26+
27+
@Override
28+
public boolean verifyResponseByInvokingProviderMethods(ProviderInfo providerInfo, ConsumerInfo consumer,
29+
Object interaction, String interactionMessage, Map failures) {
30+
try {
31+
32+
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
33+
.setScanners(new MethodAnnotationsScanner())
34+
.forPackages(packagesToScan.toArray(new String[]{}));
35+
36+
Reflections reflections = new Reflections(configurationBuilder);
37+
Set<Method> methodsAnnotatedWith = reflections.getMethodsAnnotatedWith(PactVerifyProvider.class);
38+
Set<Method> providerMethods = methodsAnnotatedWith.stream()
39+
.filter(m -> {
40+
PactVerifyProvider annotation = m.getAnnotation(PactVerifyProvider.class);
41+
return annotation.value().equals(((Interaction)interaction).getDescription());
42+
})
43+
.collect(Collectors.toSet());
44+
45+
if (providerMethods.isEmpty()) {
46+
throw new RuntimeException("No annotated methods were found for interaction " +
47+
"'${interaction.description}'. You need to provide a method annotated with " +
48+
"@PactVerifyProvider(\"${interaction.description}\") that returns the message contents.");
49+
} else {
50+
if (interaction instanceof Message) {
51+
verifyMessagePact(providerMethods, (Message) interaction, interactionMessage, failures);
52+
} else {
53+
throw new RuntimeException("only supports Message interactions!");
54+
}
55+
}
56+
} catch (Exception e) {
57+
throw new RuntimeException("verification failed", e);
58+
}
59+
return true;
60+
}
61+
62+
}

pact/pact-message-provider/src/test/java/io/reflectoring/ReflectionsTest.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

pact/pact-message-provider/src/test/java/io/reflectoring/UserCreatedMessageProviderTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import au.com.dius.pact.provider.junit.target.AmqpTarget;
1212
import au.com.dius.pact.provider.junit.target.Target;
1313
import au.com.dius.pact.provider.junit.target.TestTarget;
14+
import com.fasterxml.jackson.databind.ObjectMapper;
1415
import org.junit.runner.RunWith;
1516
import org.mockito.ArgumentCaptor;
17+
import org.mockito.Mockito;
1618
import org.springframework.beans.factory.annotation.Autowired;
1719
import org.springframework.boot.test.context.SpringBootTest;
1820
import org.springframework.boot.test.mock.mockito.MockBean;
@@ -21,17 +23,14 @@
2123
@RunWith(PactRunner.class)
2224
@Provider("userservice")
2325
@PactFolder("../pact-message-consumer/target/pacts")
24-
@SpringBootTest
2526
public class UserCreatedMessageProviderTest {
2627

2728
@TestTarget
28-
public final Target target = new AmqpTarget(Collections.singletonList("io.reflectoring"));
29+
public final Target target = new CustomAmqpTarget(Collections.singletonList("io.reflectoring"));
2930

30-
@Autowired
31-
private UserCreatedMessageProvider messageProvider;
31+
private UserCreatedMessagePublisher publisher = Mockito.mock(UserCreatedMessagePublisher.class);
3232

33-
@MockBean
34-
private UserCreatedMessagePublisher publisher;
33+
private UserCreatedMessageProvider messageProvider = new UserCreatedMessageProvider(new ObjectMapper(), publisher);
3534

3635
@PactVerifyProvider("a user created message")
3736
public String verifyUserCreatedMessage() throws IOException {

0 commit comments

Comments
 (0)