Моя задача - сделать весенние контрактные тесты для REST на весенней загрузке 1.5.6.Я заключаю контракт на YAML и устанавливаю в ответе параметр "body", выполняю чистую установку mvn, и в результате в качестве результата \ target-generate-test-sources \ contract ... \ contract появляется тест с нулем в конце теста вместопроверка правильности ответа органа.Как исправить появление нулевого в контрактных тестах и получить правильную проверку корректности тела ответа?Спасибо.
Pom xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.flamelab</groupId>
<artifactId>Contractserver</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>1.5.6.RELEASE</spring-boot.version>
<spring-cloud-contract-verifier.version>2.1.1.RELEASE</spring-cloud-contract-verifier.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-verifier</artifactId>
<version>${spring-cloud-contract-verifier.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<!--
<version>2.1.1.RELEASE</version>
-->
<extensions>true</extensions>
<configuration>
<baseClassForTests>com.flamelab.contract.ContractBaseTest</baseClassForTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</build>
</project>
Основной класс
package com.flamelab;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ContractServerApplication {
public static void main(String[] args) {
SpringApplication.run(ContractServerApplication.class, args);
}
}
Класс контроллера - контрактная оболочкапроверить этот контроллер
package com.flamelab.controller;
import com.flamelab.service.MathActions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/math")
public class MathServerController {
private MathActions mathActions;
@Autowired
public MathServerController(MathActions mathActions) {
this.mathActions = mathActions;
}
@GetMapping("/multiply")
@ResponseBody
public Integer multiplyNumber(Integer number, Integer multiplier) {
return mathActions.multiply(number, multiplier);
}
}
Класс интерфейса для обслуживания
package com.flamelab.service;
public interface MathActions {
Integer multiply(Integer number, Integer multiplier);
}
Класс обслуживания реализует интерфейс выше
package com.flamelab.service;
import org.springframework.stereotype.Service;
@Service
public class MathService implements MathActions {
@Override
public Integer multiply(Integer number, Integer multiplier) {
return number * multiplier;
}
}
application.yml
spring:
application:
name: contract-server
server:
port: 8081
Контрактная база Тестовый класс
package com.flamelab.contract;
import com.flamelab.controller.MathServerController;
import com.flamelab.service.MathService;
import io.restassured.module.mockmvc.RestAssuredMockMvc;
import org.junit.Before;
import org.junit.runner.RunWith;
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.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.AnnotationConfigWebContextLoader;
@RunWith(SpringRunner.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@DirtiesContext
@AutoConfigureMessageVerifier
public abstract class ContractBaseTest {
@Before
public void setup() {
RestAssuredMockMvc.standaloneSetup(new MathServerController(new MathService()));
}
public void makeMultiplying() {
}
}
Основной класс испытаний
package com.flamelab;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ContractServerApplicationTest {
@Test
public void contextLoads() {
}
}
Контракт на YAML
request:
method: GET
url: /math/multiply
queryParameters:
number : 2
multiplier : 2
headers:
Content-Type: application/json
response:
status: 200
headers:
Content-Type: application/json;charset=UTF-8
body: 4
В результате mvn clean install сгенерировал следующий тестовый класс в папке target \ generate-test-sources \ контракты \ com\ flamelab \ contract
package com.flamelab.contract;
import com.flamelab.contract.ContractBaseTest;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import io.restassured.module.mockmvc.specification.MockMvcRequestSpecification;
import io.restassured.response.ResponseOptions;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Test;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;
import static io.restassured.module.mockmvc.RestAssuredMockMvc.*;
import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat;
import static org.springframework.cloud.contract.verifier.util.ContractVerifierUtil.*;
public class MathTest extends ContractBaseTest {
@Test
public void validate_mathControllerContract() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("Content-Type", "application/json");
// when:
ResponseOptions response = given().spec(request)
.queryParam("number","2")
.queryParam("multiplier","2")
.get("/math/multiply");
// then:
assertThat(response.statusCode()).isEqualTo(200);
assertThat(response.header("Content-Type")).isEqualTo("application/json;charset=UTF-8");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
String responseBody = response.getBody().asString();
null; // (next text is my additional comment here) - this is the part of test which generate problems and need to fix if
}
}
Таким образом, если я удаляю параметр body в Contract, часть теста с нулевым значением не генерируется, но test не будет их целью - тестирование конечной точки REST.