diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index d94b334bc8..c093b87be3 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -21,7 +21,8 @@
spring-cloud-aws
spring-cloud-consul
spring-cloud-zuul-eureka-integration
-
+ spring-cloud-contract
+
pom
spring-cloud
diff --git a/spring-cloud/spring-cloud-contract/pom.xml b/spring-cloud/spring-cloud-contract/pom.xml
new file mode 100644
index 0000000000..3981aae2ac
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+
+
+ spring-cloud-contract-producer
+ spring-cloud-contract-consumer
+
+ pom
+
+ com.baeldung.spring.cloud
+ spring-cloud-contract
+ 1.0.0-SNAPSHOT
+
+
+
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml
new file mode 100644
index 0000000000..67fea178eb
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml
@@ -0,0 +1,68 @@
+
+
+ 4.0.0
+
+ com.baeldung.spring.cloud
+ spring-cloud-contract-consumer
+ 1.0.0-SNAPSHOT
+ jar
+
+ spring-cloud-contract-consumer
+ Spring Cloud Consumer Sample
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-contract
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-contract-wiremock
+ 1.2.2.RELEASE
+ test
+
+
+ org.springframework.cloud
+ spring-cloud-contract-stub-runner
+ 1.2.2.RELEASE
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 1.5.9.RELEASE
+
+
+ org.springframework.boot
+ spring-boot-starter-data-rest
+ 1.5.9.RELEASE
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-contract-producer
+ 1.0.0-SNAPSHOT
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/SpringCloudContractConsumerApplication.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/SpringCloudContractConsumerApplication.java
new file mode 100644
index 0000000000..7383ae5afa
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/SpringCloudContractConsumerApplication.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.cloud.springcloudcontractconsumer;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
+@SpringBootApplication
+public class SpringCloudContractConsumerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringCloudContractConsumerApplication.class, args);
+ }
+
+ @Bean
+ RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+}
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathController.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathController.java
new file mode 100644
index 0000000000..f164af89e6
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathController.java
@@ -0,0 +1,31 @@
+package com.baeldung.spring.cloud.springcloudcontractconsumer.controller;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+
+@RestController
+public class BasicMathController {
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @GetMapping("/calculate")
+ public String checkOddAndEven(@RequestParam("number") String number) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add("Content-Type", "application/json");
+
+ ResponseEntity responseEntity = restTemplate.exchange(
+ "http://localhost:8090/validate/prime-number?number=" + number,
+ HttpMethod.GET,
+ new HttpEntity<>(httpHeaders),
+ String.class);
+
+ return responseEntity.getBody();
+ }
+}
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/resources/application.yml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/resources/application.yml
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java
new file mode 100644
index 0000000000..5cf5c6d3b8
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.spring.cloud.springcloudcontractconsumer.controller;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
+@AutoConfigureMockMvc
+@AutoConfigureJsonTesters
+@AutoConfigureStubRunner(workOffline = true,
+ ids = "com.baeldung.spring.cloud:spring-cloud-contract-producer:+:stubs:8090")
+public class BasicMathControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven() throws Exception {
+ mockMvc.perform(MockMvcRequestBuilders.get("/calculate?number=2")
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("Even"));
+ }
+
+ @Test
+ public void given_WhenPassOddNumberInQueryParam_ThenReturnOdd() throws Exception {
+ mockMvc.perform(MockMvcRequestBuilders.get("/calculate?number=1")
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("Odd"));
+ }
+}
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml
new file mode 100644
index 0000000000..ac27dbb645
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.baeldung.spring.cloud
+ spring-cloud-contract-producer
+ 1.0.0-SNAPSHOT
+ jar
+
+ spring-cloud-contract-producer
+ Spring Cloud Producer Sample
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-contract
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ Edgware.SR1
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-contract-verifier
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 1.5.9.RELEASE
+
+
+ org.springframework.boot
+ spring-boot-starter-data-rest
+ 1.5.9.RELEASE
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-contract-maven-plugin
+ 1.2.2.RELEASE
+ true
+
+ com.baeldung.spring.cloud.springcloudcontractproducer.BaseTestClass
+
+
+
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/SpringCloudContractProducerApplication.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/SpringCloudContractProducerApplication.java
new file mode 100644
index 0000000000..770c68c817
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/SpringCloudContractProducerApplication.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.cloud.springcloudcontractproducer;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringCloudContractProducerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringCloudContractProducerApplication.class, args);
+ }
+}
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/controller/EvenOddController.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/controller/EvenOddController.java
new file mode 100644
index 0000000000..e61cc1120c
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/controller/EvenOddController.java
@@ -0,0 +1,15 @@
+package com.baeldung.spring.cloud.springcloudcontractproducer.controller;
+
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class EvenOddController {
+
+ @GetMapping("/validate/prime-number")
+ public String isNumberPrime(@RequestParam("number") String number) {
+ return Integer.parseInt(number) % 2 == 0 ? "Even" : "Odd";
+ }
+}
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/resources/application.properties b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/spring/cloud/springcloudcontractproducer/BaseTestClass.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/spring/cloud/springcloudcontractproducer/BaseTestClass.java
new file mode 100644
index 0000000000..253924b247
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/spring/cloud/springcloudcontractproducer/BaseTestClass.java
@@ -0,0 +1,29 @@
+package com.baeldung.spring.cloud.springcloudcontractproducer;
+
+import com.baeldung.spring.cloud.springcloudcontractproducer.controller.EvenOddController;
+import io.restassured.module.mockmvc.RestAssuredMockMvc;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
+@DirtiesContext
+@AutoConfigureMessageVerifier
+public class BaseTestClass {
+
+ @Autowired
+ private EvenOddController evenOddController;
+
+ @Before
+ public void setup() {
+ StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup(evenOddController);
+ RestAssuredMockMvc.standaloneSetup(standaloneMockMvcBuilder);
+ }
+}
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnEvenWhenRequestParamIsEven.groovy b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnEvenWhenRequestParamIsEven.groovy
new file mode 100644
index 0000000000..78c36d7334
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnEvenWhenRequestParamIsEven.groovy
@@ -0,0 +1,17 @@
+import org.springframework.cloud.contract.spec.Contract
+
+Contract.make {
+ description "should return even when number input is even"
+ request {
+ method GET()
+ url("/validate/prime-number") {
+ queryParameters {
+ parameter("number", "2")
+ }
+ }
+ }
+ response {
+ body("Even")
+ status 200
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnOddWhenRequestParamIsOdd.groovy b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnOddWhenRequestParamIsOdd.groovy
new file mode 100644
index 0000000000..215f987bbf
--- /dev/null
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnOddWhenRequestParamIsOdd.groovy
@@ -0,0 +1,17 @@
+import org.springframework.cloud.contract.spec.Contract
+
+Contract.make {
+ description "should return odd when number input is odd"
+ request {
+ method GET()
+ url("/validate/prime-number") {
+ queryParameters {
+ parameter("number", "1")
+ }
+ }
+ }
+ response {
+ body("Odd")
+ status 200
+ }
+}
\ No newline at end of file