MVN

au.com.dius : pact-jvm-provider-spring_2.11

Maven & Gradle

Nov 04, 2018
1k stars

pact-jvm-provider-spring_2.11 · # Pact Spring/JUnit runner ## Overview Library provides ability to play contract tests against a provider using Spring & JUnit. This library is based on and references the JUnit package, so see [junit provider support](pact-jvm-provider-junit) for more details regarding configuration using JUnit. Supports: - Standard ways to load pacts from folders and broker - Easy way to change assertion strategy - Spring Test MockMVC Controllers and ControllerAdvice using MockMvc standalone setup. - MockMvc debugger output - Multiple @State runs to test a particular Provider State multiple times - **au.com.dius.pact.provider.junit.State** custom annotation - before each interaction that requires a state change, all methods annotated by `@State` with appropriate the state listed will be invoked. **NOTE:** For publishing provider verification results to a pact broker, make sure the Java system property `pact.provider.version` is set with the version of your provider. ## Example of MockMvc test ```java @RunWith(RestPactRunner.class) // Custom pact runner, child of PactRunner which runs only REST tests @Provider("myAwesomeService") // Set up name of tested provider @PactFolder("pacts") // Point where to find pacts (See also section Pacts source in documentation) public class ContractTest { //Create an instance of your controller. We cannot autowire this as we're not using (and don't want to use) a Spring test runner. @InjectMocks private AwesomeController awesomeController = new AwesomeController(); //Mock your service logic class. We'll use this to create scenarios for respective provider states. @Mock private AwesomeBusinessLogic awesomeBusinessLogic; //Create an instance of your controller advice (if you have one). This will be passed to the MockMvcTarget constructor to be wired up with MockMvc. @InjectMocks private AwesomeControllerAdvice awesomeControllerAdvice = new AwesomeControllerAdvice(); //Create a new instance of the MockMvcTarget and annotate it as the TestTarget for PactRunner @TestTarget public final MockMvcTarget target = new MockMvcTarget(); @Before //Method will be run before each test of interaction public void before() { //initialize your mocks using your mocking framework MockitoAnnotations.initMocks(this); //configure the MockMvcTarget with your controller and controller advice target.setControllers(awesomeController); target.setControllerAdvice(awesomeControllerAdvice); } @State("default", "no-data") // Method will be run before testing interactions that require "default" or "no-data" state public void toDefaultState() { target.setRunTimes(3); //let's loop through this state a few times for a 3 data variants when(awesomeBusinessLogic.getById(any(UUID.class))) .thenReturn(myTestHelper.generateRandomReturnData(UUID.randomUUID(), ExampleEnum.ONE)) .thenReturn(myTestHelper.generateRandomReturnData(UUID.randomUUID(), ExampleEnum.TWO)) .thenReturn(myTestHelper.generateRandomReturnData(UUID.randomUUID(), ExampleEnum.THREE)); } @State("error-case") public void SingleUploadExistsState_Success() { target.setRunTimes(1); //tell the runner to only loop one time for this state //you might want to throw exceptions to be picked off by your controller advice when(awesomeBusinessLogic.getById(any(UUID.class))) .then(i -> { throw new NotCoolException(i.getArgumentAt(0, UUID.class).toString()); }); } } ``` ## Using a Spring runner (version 3.5.7+) You can use `SpringRestPactRunner` instead of the default Pact runner to use the Spring test annotations. This will allow you to inject or mock spring beans. For example: ```java @RunWith(SpringRestPactRunner.class) @Provider("pricing") @PactBroker(protocol = "https", host = "${pactBrokerHost}", port = "443", authentication = @PactBrokerAuth(username = "${pactBrokerUser}", password = "${pactBrokerPassword}")) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class PricingServiceProviderPactTest { @MockBean private ProductClient productClient; // This will replace the bean with a mock in the application context @TestTarget @SuppressWarnings(value = "VisibilityModifier") public final Target target = new HttpTarget(8091); @State("Product X010000021 exists") public void setupProductX010000021() throws IOException { reset(productClient); ProductBuilder product = new ProductBuilder() .withProductCode("X010000021"); when(productClient.fetch((Set<String>) argThat(contains("X010000021")), any())).thenReturn(product); } @State("the product code X00001 can be priced") public void theProductCodeX00001CanBePriced() throws IOException { reset(productClient); ProductBuilder product = new ProductBuilder() .withProductCode("X00001"); when(productClient.find((Set<String>) argThat(contains("X00001")), any())).thenReturn(product); } } ``` ### Using Spring Context Properties (version 3.5.14+) From version 3.5.14 onwards, the SpringRestPactRunner will look up any annotation expressions (like `${pactBrokerHost}`) above) from the Spring context. For Springboot, this will allow you to define the properties in the application test properties. For instance, if you create the following `application.yml` in the test resources: ```yaml pactbroker: host: "your.broker.local" port: "443" protocol: "https" auth: username: "<your broker username>" password: "<your broker password>" ``` Then you can use the defaults on the `@PactBroker` annotation. ```java @RunWith(SpringRestPactRunner.class) @Provider("My Service") @PactBroker( authentication = @PactBrokerAuth(username = "${pactbroker.auth.username}", password = "${pactbroker.auth.password}") ) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class PactVerificationTest { ``` ### Using a random port with a Springboot test (version 3.5.14+) If you use a random port in a springboot test (by setting `SpringBootTest.WebEnvironment.RANDOM_PORT`), you can use the `SpringBootHttpTarget` which will get the application port from the spring application context. For example: ```java @RunWith(SpringRestPactRunner.class) @Provider("My Service") @PactBroker @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class PactVerificationTest { @TestTarget public final Target target = new SpringBootHttpTarget(); } ```

<dependency>
    <groupId>au.com.dius</groupId>
    <artifactId>pact-jvm-provider-spring_2.11</artifactId>
    <version>3.5.24</version>
</dependency>
Copy
pom.xml
Table Of Contents

Latest Version

Choose a version of au.com.dius : pact-jvm-provider-spring_2.11 to add to Maven or Gradle - Latest Versions:

  • Latest Stable: 3.5.24
  • Latest Release Candidate: 3.5.0-rc.3

All Versions

Choose a version of au.com.dius : pact-jvm-provider-spring_2.11 to add to Maven or Gradle - All Versions:

Version Vulnerabilities Updated
3.5.x
pact-jvm-provider-spring_2.11-3.5.24
pact-jvm-provider-spring_2.11-3.5.23
pact-jvm-provider-spring_2.11-3.5.22
pact-jvm-provider-spring_2.11-3.5.21
pact-jvm-provider-spring_2.11-3.5.20
pact-jvm-provider-spring_2.11-3.5.19
pact-jvm-provider-spring_2.11-3.5.18
pact-jvm-provider-spring_2.11-3.5.17
pact-jvm-provider-spring_2.11-3.5.16
pact-jvm-provider-spring_2.11-3.5.15
pact-jvm-provider-spring_2.11-3.5.14
pact-jvm-provider-spring_2.11-3.5.13
pact-jvm-provider-spring_2.11-3.5.12
pact-jvm-provider-spring_2.11-3.5.11
pact-jvm-provider-spring_2.11-3.5.10
pact-jvm-provider-spring_2.11-3.5.9
pact-jvm-provider-spring_2.11-3.5.8
pact-jvm-provider-spring_2.11-3.5.7-jre7.0
pact-jvm-provider-spring_2.11-3.5.7
pact-jvm-provider-spring_2.11-3.5.6-jre7.0
pact-jvm-provider-spring_2.11-3.5.6
pact-jvm-provider-spring_2.11-3.5.5-jre7.0
pact-jvm-provider-spring_2.11-3.5.5
pact-jvm-provider-spring_2.11-3.5.4-jre7.0
pact-jvm-provider-spring_2.11-3.5.4
pact-jvm-provider-spring_2.11-3.5.3-jre7.0
pact-jvm-provider-spring_2.11-3.5.3
pact-jvm-provider-spring_2.11-3.5.2
pact-jvm-provider-spring_2.11-3.5.2-jre7.0
pact-jvm-provider-spring_2.11-3.5.1
pact-jvm-provider-spring_2.11-3.5.1-jre7.1
pact-jvm-provider-spring_2.11-3.5.0-jre7.1
pact-jvm-provider-spring_2.11-3.5.0-jre7
pact-jvm-provider-spring_2.11-3.5.0
pact-jvm-provider-spring_2.11-3.5.0-rc.3
pact-jvm-provider-spring_2.11-3.5.0-rc.2
pact-jvm-provider-spring_2.11-3.5.0-rc.1
3.4.x
pact-jvm-provider-spring_2.11-3.4.1
pact-jvm-provider-spring_2.11-3.4.0

How to add a dependency to Maven

Add the following au.com.dius : pact-jvm-provider-spring_2.11 maven dependency to the pom.xml file with your favorite IDE (IntelliJ / Eclipse / Netbeans):

<dependency>
    <groupId>au.com.dius</groupId>
    <artifactId>pact-jvm-provider-spring_2.11</artifactId>
    <version>3.5.24</version>
</dependency>

How to add a dependency to Gradle

Gradle Groovy DSL: Add the following au.com.dius : pact-jvm-provider-spring_2.11 gradle dependency to your build.gradle file:

implementation 'au.com.dius:pact-jvm-provider-spring_2.11:3.5.24'

Gradle Kotlin DSL: Add the following au.com.dius : pact-jvm-provider-spring_2.11 gradle kotlin dependency to your build.gradle.kts file:

implementation("au.com.dius:pact-jvm-provider-spring_2.11:3.5.24")

How to add a dependency to SBT Scala

SBT Scala: Add the following au.com.dius : pact-jvm-provider-spring_2.11 sbt scala dependency to your build.sbt file:

libraryDependencies += "au.com.dius" % "pact-jvm-provider-spring_2.11" % "3.5.24"

Advertisement