添加maven插件
添加Spring Cloud Contract BOM
接下来,Spring Cloud Contract Verifier Maven插件
您可以在Spring Cloud Contract Maven插件文档中阅读更多内容
Maven的快照版本
对于快照/里程碑版本,您必须将以下部分添加到您的pom.xml
添加存根
默认情况下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定义。
重要配置选项
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。使用示例:
制图
您可以手动将合同包的正则表达式映射为匹配合同的基类的完全限定名称。您必须提供baseClassMappings baseClassMapping的contractPackageRegex列表contractPackageRegex到baseClassFQN映射。我们来看看下面的例子:
我们假设你有合同 - 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代码使用:
为了确保提供方对定义的合同进行投诉,您需要调用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中提供以下部分
Spring Cloud Contract消费者验证者
您实际上也可以为消费者使用Spring Cloud Contract验证器!您可以使用插件,以便只转换合同并生成存根。要实现这一点,您需要以与提供程序相同的方式配置Spring Cloud Contract验证程序插件。您需要复制存储在src/test/resources/contracts中的合同,并使用以下命令生成WireMock json存根:mvn generateStubs命令。默认生成的WireMock映射存储在目录target/mappings中。您的项目应该从此生成的映射创建附加工件与分类器stubs,以便轻松部署到maven存储库。
样品配置:
当存在时,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依赖关系添加到类路径中,则可以显式排除不需要的依赖关系。