在您的Maven项目中使用

添加maven插件

添加Spring Cloud Contract BOM

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>${spring-cloud-dependencies.version}</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

接下来,Spring Cloud Contract Verifier Maven插件

<plugin>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-contract-maven-plugin</artifactId>

<version>${spring-cloud-contract.version}</version>

<extensions>true</extensions>

<configuration>

<packageWithBaseClasses>com.example.fraud</packageWithBaseClasses>

</configuration>

</plugin>

您可以在Spring Cloud Contract Maven插件文档中阅读更多内容

Maven的快照版本

对于快照/里程碑版本,您必须将以下部分添加到您的pom.xml

<repositories>

<repository>

<id>spring-snapshots</id>

<name>Spring Snapshots</name>

<url>https://repo.spring.io/snapshot</url>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

<repository>

<id>spring-milestones</id>

<name>Spring Milestones</name>

<url>https://repo.spring.io/milestone</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

<repository>

<id>spring-releases</id>

<name>Spring Releases</name>

<url>https://repo.spring.io/release</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>spring-snapshots</id>

<name>Spring Snapshots</name>

<url>https://repo.spring.io/snapshot</url>

<snapshots>

<enabled>true</enabled>

</snapshots>

</pluginRepository>

<pluginRepository>

<id>spring-milestones</id>

<name>Spring Milestones</name>

<url>https://repo.spring.io/milestone</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</pluginRepository>

<pluginRepository>

<id>spring-releases</id>

<name>Spring Releases</name>

<url>https://repo.spring.io/release</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</pluginRepository>

</pluginRepositories>

添加存根

默认情况下Spring Cloud Contract验证器正在src/test/resources/contracts目录中查找存根。包含存根定义的目录被视为一个类名称,每个存根定义被视为单个测试。我们假设它至少包含一个用作测试类名称的目录。如果有多个级别的嵌套目录,除了最后一个级别将被用作包名称。所以具有以下结构

src/test/resources/contracts/myservice/shouldCreateUser.groovy

src/test/resources/contracts/myservice/shouldReturnUser.groovy

Spring Cloud Contract验证者将使用两种方法创建测试类defaultBasePackage.MyService - shouldCreateUser() - shouldReturnUser()

运行插件

插件目标generateTests被分配为阶段generate-test-sources。只要您希望它成为构建过程的一部分,您就无所事事。如果您只想生成测试,请调用generateTests目标。

配置插件

要更改默认配置,只需将configuration部分添加到插件定义或execution定义。

<plugin>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-contract-maven-plugin</artifactId>

    <executions>

        <execution>

            <goals>

                <goal>convert</goal>

                <goal>generateStubs</goal>

                <goal>generateTests</goal>

            </goals>

        </execution>

    </executions>

    <configuration>

        <basePackageForTests>org.springframework.cloud.verifier.twitter.place</basePackageForTests>

        <baseClassForTests>org.springframework.cloud.verifier.twitter.place.BaseMockMvcSpec</baseClassForTests>

    </configuration>

</plugin>

重要配置选项

    testMode - 定义接受测试的模式。默认MockMvc,它基于Spring的MockMvc。对于真正的HTTP呼叫,它也可以更改为JaxRsClient或Explicit。

    basePackageForTests - 为所有生成的测试指定基础包。默认设置为org.springframework.cloud.verifier.tests。

    ruleClassForTests - 指定应该添加到生成的测试类的规则。

    baseClassForTests - 生成测试的基类。如果使用Spock测试,默认为spock.lang.Specification。

    contractDir - 包含使用GroovyDSL编写的合同的目录。默认/src/test/resources/contracts。

    testFramework - 要使用的目标测试框架; JUnit作为默认框架,目前支持Spock和JUnit

    packageWithBaseClasses - 而不是为基类提供固定值,您可以提供一个所有基类放置的包。约定是这样的,如果你有合同src/test/resources/contract/foo/bar/baz/,并提供这个属性的值到com.example.base,那么我们将假设com.example.base包含com.example.base类。优先于baseClassForTests

    baseClassMappings - 您必须提供contractPackageRegex的基类映射列表,该列表根据合同所在的包进行检查,并且baseClassFQN映射到匹配合同的基类的完全限定名称。如果您有合同src/test/resources/contract/foo/bar/baz/并映射了属性.*→com.example.base.BaseClass,则从这些合同生成的测试类将扩展com.example.base.BaseClass。优先于packageWithBaseClasses 和baseClassForTests。

如果要从Maven存储库中下载合同定义,可以使用

    contractsRepositoryUrl - 具有合同的工件的repo的URL(如果没有提供)应使用当前的Maven

    contractDependency - 包含所有打包合同的合同依赖关系

    contractPath - 通过打包合同在JAR中具体合同的路径。默认为groupid/artifactid,其中gropuid被斜杠分隔。

    contractWorkOffline - 如果依赖关系应该被下载,或者本地Maven只能被重用

有关完整信息,请参阅插件文档

所有测试的单一基类

在默认的MockMvc中使用Spring Cloud Contract验证器时,您需要为所有生成的验收测试创建一个基本规范。在这个类中,您需要指向应验证的端点。

package org.mycompany.tests

import org.mycompany.ExampleSpringController

import com.jayway.restassured.module.mockmvc.RestAssuredMockMvc

import spock.lang.Specification

class  MvcSpec extends Specification {

  def setup() {

  RestAssuredMockMvc.standaloneSetup(new ExampleSpringController())

  }

}

在使用Explicit模式的情况下,您可以像常规集成测试一样使用基类来初始化整个测试的应用程序。在JAXRSCLIENT模式的情况下,这个基类也应该包含protected WebTarget webTarget字段,现在测试JAX-RS API的唯一选项是启动Web服务器。

不同的基础类别的合同

如果您的基类在合同之间不同,您可以告诉Spring Cloud Contract插件哪个类应该由自动生成测试扩展。你有两个选择:

    遵循约定,提供packageWithBaseClasses

    通过baseClassMappings提供显式映射

惯例

约定是这样的,如果你有合同,例如src/test/resources/contract/hello/v1/,并将packageWithBaseClasses属性的值提供给hello,那么我们将假设在hello下有一个HelloV1Base类包。换句话说,如果它们存在并且形成具有Base后缀的类,那么我们将使用最后两个包的部分。优先于baseClassForTests。使用示例:

<plugin>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-contract-maven-plugin</artifactId>

<configuration>

<packageWithBaseClasses>hello</packageWithBaseClasses>

</configuration>

</plugin>

制图

您可以手动将合同包的正则表达式映射为匹配合同的基类的完全限定名称。您必须提供baseClassMappings baseClassMapping的contractPackageRegex列表contractPackageRegex到baseClassFQN映射。我们来看看下面的例子:

<plugin>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-contract-maven-plugin</artifactId>

<configuration>

<baseClassForTests>com.example.FooBase</baseClassForTests>

<baseClassMappings>

<baseClassMapping>

<contractPackageRegex>.*com.*</contractPackageRegex>

<baseClassFQN>com.example.TestBase</baseClassFQN>

</baseClassMapping>

</baseClassMappings>

</configuration>

</plugin>

我们假设你有合同 - src/test/resources/contract/com/ - src/test/resources/contract/foo/

通过提供baseClassForTests,我们有一个后备程序,如果映射没有成功(你也可以提供packageWithBaseClasses作为备用)。这样,从src/test/resources/contract/com/合同生成的测试将扩展com.example.ComBase,而其余的测试将扩展com.example.FooBase。

调用生成的测试

Spring Cloud Contract Maven插件将验证码生成到目录/generated-test-sources/contractVerifier中,并将此目录附加到testCompile目标。

对于Groovy Spock代码使用:

<plugin>

<groupId>org.codehaus.gmavenplus</groupId>

<artifactId>gmavenplus-plugin</artifactId>

<version>1.5</version>

<executions>

<execution>

<goals>

<goal>testCompile</goal>

</goals>

</execution>

</executions>

<configuration>

<testSources>

<testSource>

<directory>${project.basedir}/src/test/groovy</directory>

<includes>

<include>**/*.groovy</include>

</includes>

</testSource>

<testSource>

<directory>${project.build.directory}/generated-test-sources/contractVerifier</directory>

<includes>

<include>**/*.groovy</include>

</includes>

</testSource>

</testSources>

</configuration>

</plugin>

为了确保提供方对定义的合同进行投诉,您需要调用mvn generateTest test

Maven插件常见问题

Maven插件和STS

如果在使用STS时看到以下异常

STS异常

当您点击标记时,您应该看到这样的sth

plugin:1.1.0.M1:convert:default-convert:process-test-resources) org.apache.maven.plugin.PluginExecutionException: Execution default-convert of goal org.springframework.cloud:spring-

cloud-contract-maven-plugin:1.1.0.M1:convert failed. at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:145) at

org.eclipse.m2e.core.internal.embedder.MavenImpl.execute(MavenImpl.java:331) at org.eclipse.m2e.core.internal.embedder.MavenImpl$11.call(MavenImpl.java:1362) at

...

org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) Caused by: java.lang.NullPointerException at

org.eclipse.m2e.core.internal.builder.plexusbuildapi.EclipseIncrementalBuildContext.hasDelta(EclipseIncrementalBuildContext.java:53) at

org.sonatype.plexus.build.incremental.ThreadBuildContext.hasDelta(ThreadBuildContext.java:59) at

为了解决这个问题,请在pom.xml中提供以下部分

<build>

    <pluginManagement>

        <plugins>

            <!--This plugin's configuration is used to store Eclipse m2e settings

                only. It has no influence on the Maven build itself. -->

            <plugin>

                <groupId>org.eclipse.m2e</groupId>

                <artifactId>lifecycle-mapping</artifactId>

                <version>1.0.0</version>

                <configuration>

                    <lifecycleMappingMetadata>

                        <pluginExecutions>

                            <pluginExecution>

                                <pluginExecutionFilter>

                                    <groupId>org.springframework.cloud</groupId>

                                    <artifactId>spring-cloud-contract-maven-plugin</artifactId>

                                    <versionRange>[1.0,)</versionRange>

                                    <goals>

                                        <goal>convert</goal>

                                    </goals>

                                </pluginExecutionFilter>

                                <action>

                                    <execute />

                                </action>

                            </pluginExecution>

                        </pluginExecutions>

                    </lifecycleMappingMetadata>

                </configuration>

            </plugin>

        </plugins>

    </pluginManagement>

</build>

Spring Cloud Contract消费者验证者

您实际上也可以为消费者使用Spring Cloud Contract验证器!您可以使用插件,以便只转换合同并生成存根。要实现这一点,您需要以与提供程序相同的方式配置Spring Cloud Contract验证程序插件。您需要复制存储在src/test/resources/contracts中的合同,并使用以下命令生成WireMock json存根:mvn generateStubs命令。默认生成的WireMock映射存储在目录target/mappings中。您的项目应该从此生成的映射创建附加工件与分类器stubs,以便轻松部署到maven存储库。

样品配置:

<plugin>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-contract-maven-plugin</artifactId>

    <version>${verifier-plugin.version}</version>

    <executions>

        <execution>

            <goals>

                <goal>convert</goal>

                <goal>generateStubs</goal>

            </goals>

        </execution>

    </executions>

</plugin>

当存在时,json存根可用于消费者自动测试。

@RunWith(SpringTestRunner.class)

@SpringBootTest

@AutoConfigureStubRunner

public class LoanApplicationServiceTests {

  @Autowired

  LoanApplicationService service;

  @Test

  public void shouldSuccessfullyApplyForLoan() {

    //given:

LoanApplication application =

new LoanApplication(new Client("12345678901"), 123.123);

    //when:

LoanApplicationResult loanApplication = service.loanApplication(application);

    // then:

assertThat(loanApplication.loanApplicationStatus).isEqualTo(LoanApplicationStatus.LOAN_APPLIED);

assertThat(loanApplication.rejectionReason).isNull();

  }

}

LoanApplication下方致电FraudDetection服务。此请求由使用Spring Cloud Contract验证器生成的存根配置的WireMock服务器进行处理。

方案

可以使用Spring Cloud Contract验证程序处理场景。所有您需要做的是在创建合同时坚持正确的命名约定。公约要求包括后面是下划线的订单号。

my_contracts_dir\

  scenario1\

    1_login.groovy

    2_showCart.groovy

    3_logout.groovy

这样的树将导致Spring Cloud Contract验证器生成名为scenario1的WireMock场景和三个步骤:

    登录标记为Started,指向:

    showCart标记为Step1指向:

    注销标记为Step2,这将关闭场景。

有关WireMock场景的更多详细信息,请参见http://wiremock.org/stateful-behaviour.html

Spring Cloud Contract验证者还将生成具有保证执行顺序的测试。

存根和传递依赖

我们创建的Maven和Gradle插件是为您添加创建存根jar的任务。可能有问题的是,当重用存根时,您可以错误地导入所有这些存根依赖关系!即使你有几个不同的罐子,建造一个Maven的工件,他们都有一个pom:

├── github-webhook-0.0.1.BUILD-20160903.075506-1-stubs.jar

├── github-webhook-0.0.1.BUILD-20160903.075506-1-stubs.jar.sha1

├── github-webhook-0.0.1.BUILD-20160903.075655-2-stubs.jar

├── github-webhook-0.0.1.BUILD-20160903.075655-2-stubs.jar.sha1

├── github-webhook-0.0.1.BUILD-SNAPSHOT.jar

├── github-webhook-0.0.1.BUILD-SNAPSHOT.pom

├── github-webhook-0.0.1.BUILD-SNAPSHOT-stubs.jar

├── ...

└── ...

使用这些依赖关系有三种可能性,以便不会对传递依赖性产生任何问题。

将所有应用程序依赖项标记为可选

如果在github-webhook应用程序中,我们将所有的依赖项标记为可选的,当您将github-webhook存根包含在另一个应用程序中(或者当依赖关系由Stub Runner下载)时,因为所有的依赖关系是可选的,它们不会被下载。

为存根创建一个单独的artifactid

如果你创建一个单独的artifactid,那么你可以设置任何你想要的方式。例如通过没有依赖关系。

排除消费者方面的依赖关系

作为消费者,如果将stub依赖关系添加到类路径中,则可以显式排除不需要的依赖关系。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • API版本控制 让我们尝试回答一个真正意义上的版本控制的问题。如果你指的是API版本,那么有不同的方法。 使用超媒...
    咔啡阅读 297评论 0 1
  • 存储合同以外的另一种方法是将它们保存在一个共同的地方。它可能与消费者无法克隆生产者代码的安全问题相关。另外,如果您...
    咔啡阅读 182评论 0 1
  • 官方文档链接地址:http://docs.spring.io/spring-boot/docs/1.3.0.BUI...
    _fan凡阅读 26,235评论 0 3
  • 毕业项目 先决条件 为了在WireMock中使用Spring Cloud Contract验证器,您必须使用Gra...
    咔啡阅读 232评论 0 1
  • 使用Spring Cloud Contract验证程序时可能遇到的一个问题是将生成的WireMock JSON存根...
    咔啡阅读 844评论 0 1