【问题标题】:Spring Cloud Contract ContractVerifierTest.java not generatedSpring Cloud Contract ContractVerifierTest.java 未生成
【发布时间】:2022-02-04 16:52:25
【问题描述】:

所以我正在尝试用 Java 编写合约,但问题是验证测试根本没有运行。我试过用 Groovy 编写合约,运行良好,不知道有什么区别。

插件是否缺少一些配置?我正在关注来自here 的示例项目。

这是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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>contract_producer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>contract_producer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>8</java.version>
        <spring-cloud.version>2020.0.5</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-contract-maven-plugin</artifactId>
                <version>2.2.8.RELEASE</version>
                <extensions>true</extensions>
                <configuration>
                    <testFramework>JUNIT5</testFramework>
                    <baseClassForTests>
                        com.example.contract_producer.contracts.BaseTest
                    </baseClassForTests>
                    <contractsDirectory>src/test/java/contracts</contractsDirectory>
                    <depedencies>
                        <dependency>
                            <groupId>org.springframework.cloud</groupId>
                            <artifactId>spring-cloud-starter-contract-verifier</artifactId>
                            <version>${spring-cloud-contract.version}</version>
                            <scope>compile</scope>
                        </dependency>
                    </depedencies>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

这是用Java编写的合约

package contracts;

import org.springframework.cloud.contract.spec.Contract;

import java.util.function.Consumer;
import java.util.function.Supplier;

public class UserControllerContracts implements Supplier<Contract> {
    @Override
    public Contract get() {
        return Contract.make(new Consumer<Contract>() {
            @Override
            public void accept(Contract c) {
                c.name("Get All User Contract");
                c.description("Contract for /users and /user/all");
                
                c.request(request -> {
                    request.method(request.GET());
                    request.url("/user/all");
                });
    
                c.response(response -> {
                    response.status(response.OK());
                    response.body("[{\"id\":1,\"email\":\"user@email.com\",\"password\":\"password\",\"name\":\"User\"}]");
                });
            }
        });
    }

    public static class User {
        Integer id;
        String email;
        String password;
        String name;

        public User(Integer id, String email, String password, String name) {
            this.id = id;
            this.email = email;
            this.password = password;
            this.name = name;
        }
    }
}

这是用 Groovy 编写的合约

package contracts

import org.springframework.cloud.contract.spec.Contract

Contract.make {
    description 'Should return all user in database'

    request {
        method GET()
        url '/user/all'
    }

    response {
        status OK()
        headers {
            contentType applicationJson()
        }
        body '''
            [{
                "id": 1,
                "email": "user@email.com",
                "password": "password",
                "name": "User"
            }]
        '''
    }
}

【问题讨论】:

    标签: java spring groovy spring-cloud-contract


    【解决方案1】:

    您使用了错误版本的插件。看看你通过 2020.0.x 发布火车插件使用 3.0.x 版本的合同。由于旧插件生成 junit4 测试,因此最新启动不会运行它。只需将插件升级到最新的 3.0.x 版本即可。

    【讨论】:

    • 所以我根据this将发布列车设置为2020.0.4,合同版本设置为3.0.4,但它仍然没有运行,阅读我遇到的maven日志信息` `` [INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @contract_producer --- [INFO] 复制 1 个资源 [INFO] 跳过不存在的资源目录 \contract_producer\target\generated-test -resources\contracts ```这不是应该运行测试的目标吗?
    • 应该在target\generated-test-sources\contracts\com\example\contract_producer\contracts\ContractVerifierTest.javatarget\generated-test-sources\contracts\ContractVerifierTest.java下生成ContractVerifierTest.java吗?
    • 它不会运行测试它会根据您的 Maven 设置在文件夹中生成测试
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2017-02-17
    • 1970-01-01
    • 2018-12-27
    • 2017-09-29
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多