Производитель весеннего облачного контракта генерирует тестовый контракт и в конце теста устанавливает нулевое значение вместо подтверждения результата тела по контракту - PullRequest
0 голосов
/ 16 мая 2019

Моя задача - сделать весенние контрактные тесты для 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...