Gradle 项目
先决条件
要将 Spring Cloud Contract Verifier 与 WireMock 一起使用,必须使用 Gradle 或 Maven 插件。
如果你想在你的项目中使用 Spock,你必须单独添加 和 模块。查看 Spock's
文档了解更多信息。spock-core spock-spring |
添加具有依赖项的 Gradle 插件
要添加具有依赖项的 Gradle 插件,您可以使用类似于以下内容的代码:
- 插件 DSL GA 版本
-
// build.gradle plugins { id "groovy" // this will work only for GA versions of Spring Cloud Contract id "org.springframework.cloud.contract" version "$\{GAVerifierVersion}" } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:$\{GAVerifierVersion}" } } dependencies { testImplementation "org.apache.groovy:groovy-all:$\{groovyVersion}" // example with adding Spock core and Spock Spring testImplementation "org.spockframework:spock-core:$\{spockVersion}" testImplementation "org.spockframework:spock-spring:$\{spockVersion}" testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier' }
- 插件 DSL 非 GA 版本
-
// settings.gradle pluginManagement { plugins { id "org.springframework.cloud.contract" version "$\{verifierVersion}" } repositories { // to pick from local .m2 mavenLocal() // for snapshots maven { url "https://repo.spring.io/snapshot" } // for milestones maven { url "https://repo.spring.io/milestone" } // for GA versions gradlePluginPortal() } } // build.gradle plugins { id "groovy" id "org.springframework.cloud.contract" } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:$\{verifierVersion}" } } dependencies { testImplementation "org.apache.groovy:groovy-all:$\{groovyVersion}" // example with adding Spock core and Spock Spring testImplementation "org.spockframework:spock-core:$\{spockVersion}" testImplementation "org.spockframework:spock-spring:$\{spockVersion}" testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier' }
- 旧版插件应用程序
-
// build.gradle buildscript { repositories { mavenCentral() } dependencies { classpath "org.springframework.boot:spring-boot-gradle-plugin:$\{springboot_version}" classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:$\{verifier_version}" // here you can also pass additional dependencies such as Kotlin spec e.g.: // classpath "org.springframework.cloud:spring-cloud-contract-spec-kotlin:$\{verifier_version}" } } apply plugin: 'groovy' apply plugin: 'org.springframework.cloud.contract' dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:$\{verifier_version}" } } dependencies { testImplementation "org.apache.groovy:groovy-all:$\{groovyVersion}" // example with adding Spock core and Spock Spring testImplementation "org.spockframework:spock-core:$\{spockVersion}" testImplementation "org.spockframework:spock-spring:$\{spockVersion}" testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier' }
Gradle 和 Rest Assured 2.0
默认情况下,Rest Assured 3.x 将添加到 Classpath 中。但是,要使用 Rest Assured 2.x, 您可以添加它,如下面的清单所示:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:$\{springboot_version}"
classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:$\{verifier_version}"
}
}
dependencies {
// all dependencies
// you can exclude rest-assured from spring-cloud-contract-verifier
testCompile "com.jayway.restassured:rest-assured:2.5.0"
testCompile "com.jayway.restassured:spring-mock-mvc:2.5.0"
}
这样,插件会自动看到 Rest Assured 2.x 存在于 Classpath 中 并相应地修改导入。
添加存根
默认情况下, Spring Cloud Contract Verifier 在目录中查找存根。出于过渡目的,插件
也会在 中查找 ,但是,此目录
从 Spring Cloud Contract 3.0.0 开始已弃用。src/contractTest/resources/contracts
src/test/resources/contracts
还应注意,使用这个新的 Gradle 源代码集,您还应该迁移
在你的 Contract 测试中使用的任何基类都应该根据你的目的用 Java 或 Groovy 替换。src/contractTest/{language}
{language}
包含 stub 定义的目录被视为类名,每个 stub 定义被视为单个测试。Spring Cloud Contract Verifier 假定它 包含至少一个级别要用作测试类名的目录。 如果存在多个级别的嵌套目录,则使用除最后一个目录之外的所有目录 作为软件包名称。请考虑以下结构:
src/contractTest/resources/contracts/myservice/shouldCreateUser.groovy
src/contractTest/resources/contracts/myservice/shouldReturnUser.groovy
给定前面的结构, Spring Cloud Contract Verifier 创建一个测试类,该测试类使用两种方法命名:defaultBasePackage.MyService
-
shouldCreateUser()
-
shouldReturnUser()
默认设置
默认的 Gradle 插件设置会创建构建的以下 Gradle 部分(在 伪代码):
contracts {
testFramework ='JUNIT'
testMode = 'MockMvc'
generatedTestJavaSourcesDir = project.file("$\{project.buildDir}/generated-test-sources/contractTest/java")
generatedTestGroovySourcesDir = project.file("$\{project.buildDir}/generated-test-sources/contractTest/groovy")
generatedTestResourcesDir = project.file("$\{project.buildDir}/generated-test-resources/contracts")
contractsDslDir = project.file("$\{project.projectDir}/src/contractTest/resources/contracts")
basePackageForTests = 'org.springframework.cloud.verifier.tests'
stubsOutputDir = project.file("$\{project.buildDir}/stubs")
sourceSet = null
}
def verifierStubsJar = tasks.register(type: Jar, name: 'verifierStubsJar', dependsOn: 'generateClientStubs') {
baseName = project.name
classifier = contracts.stubsSuffix
from contractVerifier.stubsOutputDir
}
def copyContracts = tasks.register(type: Copy, name: 'copyContracts') {
from contracts.contractsDslDir
into contracts.stubsOutputDir
}
verifierStubsJar.dependsOn copyContracts
配置插件
要更改默认配置,您可以向 Gradle 添加代码段
配置,如下面的清单所示:contracts
contracts {
testMode = 'MockMvc'
baseClassForTests = 'org.mycompany.tests'
generatedTestJavaSourcesDir = project.file('src/generatedContract')
}
要从远程源下载合同,您可以根据需要使用以下代码段:
contracts {
// If your contracts exist in a JAR archive published to a Maven repository
contractDependency {
stringNotation = ''
// OR
groupId = ''
artifactId = ''
version = ''
classifier = ''
}
// If your contracts exist in a Git SCM repository
contractRepository {
repositoryUrl = ''
// username = ''
// password = ''
}
// controls the nested location to find the contracts in either the JAR or Git SCM source
contractsPath = ''
}
由于我们使用的是 Gradle 的 Jar 打包任务,因此您可能希望利用多个选项和功能来进一步扩展由 .为此,您将使用 Gradle 直接提供的本机机制来自定义现有任务,如下所示:verifierStubsJar
为了示例,我们希望将文件添加到 .git.properties verifierStubsJar |
verifierStubsJar {
from("$\{buildDir}/resources/main/") {
include("git.properties")
}
}
还应注意,从 3.0.0 开始,默认发布已被禁用。因此,这意味着您可以创建任何命名的 jar 并发布它,就像您通常通过 Gradle 配置选项所做的那样。这意味着您可以按照自己的方式构建自定义的 jar 文件,并发布该文件,以便对 jar 的布局和内容进行绝对的完全控制。
配置选项
-
testMode
:定义验收测试的模式。默认情况下,模式为 MockMvc, 它基于 Spring 的 MockMvc。它也可以更改为 WebTestClient、JaxRsClient 或 显式(用于实际 HTTP 调用)。 -
imports
:创建一个包含应包含在生成的测试中的导入的数组 (例如,)。默认情况下,它会创建一个空数组。['org.myorg.Matchers']
-
staticImports
:创建一个包含应包含在 生成的测试(例如 )。默认情况下,它会创建一个空的 数组。['org.myorg.Matchers.*']
-
basePackageForTests
:指定所有生成的测试的基础包。如果未设置,则 该值是从 和 from 的包中选取的。 如果这两个值均未设置,则该值将设置为 。baseClassForTests
packageWithBaseClasses
org.springframework.cloud.contract.verifier.tests
-
baseClassForTests
:为所有生成的测试创建一个基类。默认情况下,如果你 使用 Spock 类,则类为 。spock.lang.Specification
-
packageWithBaseClasses
:定义所有基类所在的包。这 setting 优先于 。baseClassForTests
-
baseClassMappings
:将协定包显式映射到基类的 FQN。这 setting 优先于 和 。packageWithBaseClasses
baseClassForTests
-
ignoredFiles
:使用 允许定义要处理的存根文件 应该跳过。默认情况下,它是一个空数组。Antmatcher
-
contractsDslDir
:指定包含使用 GroovyDSL 的默认情况下,其值为 。$projectDir/src/contractTest/resources/contracts
-
generatedTestSourcesDir
:指定生成测试的测试源目录 应该放置 Groovy DSL。(已弃用) -
generatedTestJavaSourcesDir
:指定测试源目录,从 Groovy DSL 生成的 Java/JUnit 测试应放置在其中。默认情况下,它的值为 .$buildDir/generated-tes-sources/contractTest/java
-
generatedTestGroovySourcesDir
:指定测试源目录,应将从 Groovy DSL 生成的 Groovy/Spock 测试放置在该目录下。默认情况下,它的值为 .$buildDir/generated-test-sources/contractTest/groovy
-
generatedTestResourcesDir
:指定测试使用的资源的测试资源目录,其中生成了测试 应该放置 Groovy DSL。默认情况下,其值为 。$buildDir/generated-test-resources/contractTest
-
stubsOutputDir
:指定生成的 WireMock 存根的目录 应该放置 Groovy DSL。 -
testFramework
:指定要使用的目标测试框架。目前,Spock、JUnit 4 () 和 支持 JUnit 5,其中 JUnit 4 是默认框架。TestFramework.JUNIT
-
contractsProperties
:包含要传递给 Spring Cloud Contract 的属性的 map 组件。这些属性可能由(例如)内置或自定义 Stub Downloader 使用。 -
sourceSet
:存储合同的源集。如果未提供,将假定(例如,对于 JUnit 或 Spock)。contractTest
project.sourceSets.contractTest.java
project.sourceSets.contractTest.groovy
当您想要指定 JAR 的位置时,可以使用以下属性 ,其中包含 Contracts:
-
contractDependency
:指定提供坐标的 Dependency你可以使用 closure 来设置它。groupid:artifactid:version:classifier
contractDependency
-
contractsPath
:指定 jar 的路径。如果合约依赖项为 downloaded,则路径默认为 ,其中 是斜杠 分开。否则,它会扫描提供的目录下的 Contract。groupid/artifactid
groupid
-
contractsMode
:指定下载合约的方式(无论 JAR 可脱机、远程使用等)。 -
deleteStubsAfterTest
:如果设置为 ,则不会删除任何已下载的 来自临时目录的 Contract。false
-
failOnNoContracts
:启用后,如果未找到 Contract,将引发异常。默认为 。true
-
failOnInProgress
:如果设置为 ,则如果找到任何正在进行的合同,则它们会中断构建。在生产者方面,您需要明确说明您有正在进行的合同这一事实,并考虑到您可能会在消费者方面导致误报测试结果。默认为 。true
true
还有包含以下属性的闭包contractRepository { … }
-
repositoryUrl
:包含合同定义的存储库的 URL -
username
:仓库用户名 -
password
:仓库密码 -
proxyPort
:代理的端口 -
proxyHost
:代理的主机 -
cacheDownloadedContracts
:如果设置为 ,则缓存下载非快照合约构件的文件夹。默认为 。true
true
您还可以在插件中打开以下实验性功能:
-
convertToYaml
:将所有 DSL 转换为声明式 YAML 格式。这可能是非常 当您在 Groovy DSL 中使用外部库时很有用。通过启用此功能 (通过将其设置为 ),您无需在 Consumer 端添加库依赖项。true
-
assertJsonSize
:您可以在生成的测试中检查 JSON 数组的大小。这 功能默认处于禁用状态。
所有测试的单个基类
在 MockMvc(默认)中使用 Spring Cloud Contract Verifier 时,需要创建一个 base 规范。在此类中,您需要指向一个 endpoint,该端点应进行验证。以下示例显示了如何执行此操作:
abstract class BaseMockMvcSpec extends Specification {
def setup() {
RestAssuredMockMvc.standaloneSetup(new PairIdController())
}
void isProperCorrelationId(Integer correlationId) {
assert correlationId == 123456
}
void isEmpty(String value) {
assert value == null
}
}
如果使用 mode,则可以使用基类来初始化整个测试的应用程序。
正如您在常规集成测试中可能看到的那样。如果您使用该模式,则此
基类还应包含一个字段。现在,
测试 JAX-RS API 的唯一选项是启动 Web 服务器。Explicit
JAXRSCLIENT
protected WebTarget webTarget
Contract 的不同基类
如果您的基类在 Contract 之间不同,则可以告诉 Spring Cloud Contract plugin 哪个类应该由自动生成的测试进行扩展。您有两个选项:
-
遵循约定,提供
packageWithBaseClasses
-
使用
baseClassMappings
按约定
约定是这样的,如果您在(例如)中有一个 Contract 并将属性的值设置为,则 Spring Cloud Contract
验证程序假定包下有一个类。
换句话说,系统采用包的最后两部分(如果存在),并且
形成一个带有后缀的类。此规则优先于 。src/contractTest/resources/contract/foo/bar/baz/
packageWithBaseClasses
com.example.base
BarBazBase
com.example.base
Base
baseClassForTests
按映射
您可以手动将 Contract 包的正则表达式映射到完全限定的
匹配合约的基类名称。您必须提供一个名为 的列表,该列表由采用 to 映射的对象组成。baseClassMappings
baseClassMapping
contractPackageRegex
baseClassFQN
假设您在以下目录中有 Contract:
-
src/contractTest/resources/contract/com/
-
src/contractTest/resources/contract/foo/
通过提供 ,我们可以在映射未成功的情况下进行回退。
(您也可以提供 作为后备。这样,测试
从 Contract 生成 扩展 ,而其余测试扩展 。baseClassForTests
packageWithBaseClasses
src/contractTest/resources/contract/com/
com.example.ComBase
com.example.FooBase
将桩模块发布到构件存储库
如果您使用二进制构件存储库来保留存根,则
您需要配置 Gradle 的发布部分,以便
包括 .为此,您可以使用
示例配置如下:verifierStubsJar
apply plugin: 'maven-publish'
publishing {
publications {
maven(MavenPublication) {
// other configuration
artifact verifierStubsJar
}
}
}
从 3.0.0 开始,内部存根发布已被弃用
和 Disabled 的 Enabled 。建议将 包含在您自己的出版物中。verifierStubsJar
将存根推送到 SCM
如果您使用 SCM 存储库来保留合同和
stubs 中,您可能希望自动执行将 stub 推送到
存储库。为此,您可以通过运行以下命令来调用任务:pushStubsToScm
$ ./gradlew pushStubsToScm
在 Using the SCM Stub Downloader 下,您可以找到所有可能的
配置选项,您可以通过
字段(例如, ),
通过方法(例如, ),
或通过系统属性或环境变量。contractsProperties
contracts { contractsProperties = [foo:"bar"] }
contractsProperties
contracts { contractsProperties([foo:"bar"]) }
Consumer 端的 Spring Cloud Contract Verifier
在消费服务中,您需要配置 Spring Cloud Contract Verifier 插件
与提供商的情况完全相同。如果您不想使用 Stub Runner,则
您需要复制存储在 中的 Contract 并生成
使用以下命令对 WireMock JSON 存根进行操作:src/contractTest/resources/contracts
./gradlew generateClientStubs
必须设置该选项才能使存根生成正常工作。stubsOutputDir |
如果存在,您可以在自动测试中使用 JSON 存根来使用服务。这 以下示例显示了如何执行此操作:
@ContextConfiguration(loader == SpringApplicationContextLoader, classes == Application)
class LoanApplicationServiceSpec extends Specification {
@ClassRule
@Shared
WireMockClassRule wireMockRule == new WireMockClassRule()
@Autowired
LoanApplicationService sut
def 'should successfully apply for loan'() {
given:
LoanApplication application =
new LoanApplication(client: new Client(clientPesel: '12345678901'), amount: 123.123)
when:
LoanApplicationResult loanApplication == sut.loanApplication(application)
then:
loanApplication.loanApplicationStatus == LoanApplicationStatus.LOAN_APPLIED
loanApplication.rejectionReason == null
}
}
在前面的示例中,调用服务。
此请求由 WireMock 服务器处理,该服务器配置了由
Spring Cloud Contract Verifier 中。LoanApplication
FraudDetection