微服务很多时,服务之前相互调用,接口参数的一致性要变得很难维护。
spring cloud>spring cloud contract 提供了测试接口一致性的方法。
一 项目配置
plugins {id "groovy"id "org.springframework.cloud.contract" version "4.0.5"id "maven-publish"
}String contractVersion = "1.0.0-contract-SNAPSHOT"ext {set('springCloudVersion', "2022.0.5")set('groovyVersion', "4.0.20")set('contractVersion', "4.0.5")set('streamVersion', "4.0.5")
}contracts {testMode = 'MockMvc'deleteStubsAfterTest = truebaseClassForTests = "com.leve.${artifactId}.ContractTestBase"generatedTestJavaSourcesDir = project.file("src/contractTest/contract")
}dependencies {testImplementation("org.apache.groovy:groovy-all:${groovyVersion}")testImplementation("org.springframework.cloud:spring-cloud-starter-contract-verifier")testImplementation("org.springframework.cloud:spring-cloud-starter-contract-stub-runner")
}dependencyManagement {imports {mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${property("contractVersion")}"mavenBom ("org.springframework.cloud:spring-cloud-stream-dependencies:${property("streamVersion")}")}
}publishing {publications {maven(MavenPublication) {artifact(tasks.named('verifierStubsJar'))}// 如果项目名称带有横杠的,比如说auth-ghost,那么需要像下面这样去掉横杠,不然openfign404// maven.artifactId = "authghost"}repositories {maven {url = uri("https://nexus.111.com/repository/leve-maven/")version = contractVersioncredentials {username = nexusUsernamepassword = nexusPassword}allowInsecureProtocol = false}}
}
二 基类
公共基类, 需要注意基类所在的路径,可以修改配置指定基类的名称和路径。
/*** ContractTestBase*/
@SpringBootTest(properties = {"spring.cloud.function.definition=",
})
@AutoConfigureStubRunner
public class ContractTestBase{@Autowiredprivate WebApplicationContext applicationContext;@MockBeanprivate UserInfoService userInfoService;@BeforeEachpublic void setUp() {RestAssuredMockMvc.webAppContextSetup(applicationContext);}}
三 消费端配置
ids看你需要哪些服务,自行增改。版本号可以不要,会拉取最新的。
stubrunner:ids:- "com.test:user"- "com.test:ghost"repositoryRoot: https://nexus.test.com/repository/leve-maven/stubsMode: REMOTE
在测试类上面使用 @AutoConfigureStubRunner
四 运行测试
User服务调用 ghost服务的 接口
4.1 生产端
https://i-blog.csdnimg.cn/direct/c00a2377521b4aefa85ac2fe2381d062.png" alt="在这里插入图片描述" />
在ghost服务按照上面的配置,写好contract.yml文件,构建测试通过后,然后publish到nexus上面
https://i-blog.csdnimg.cn/direct/bf5a94ac3f3a49288877fcfcee646b1f.png" alt="在这里插入图片描述" />
https://i-blog.csdnimg.cn/direct/43b32c0f88114bd6b9e2ef5656a2b4d8.png" alt="在这里插入图片描述" />
4.2 消费端
bootstrap.yml文件添加对应的生产端服务id
https://i-blog.csdnimg.cn/direct/a805d54a428c4b4ba14a927e151b1b28.png" alt="在这里插入图片描述" />
然后再对应的测试类上面添加 @AutoConfigureStubRunner
https://i-blog.csdnimg.cn/direct/8768a4cb27464d2d8a66851934d2f520.png" alt="在这里插入图片描述" />
测试方法
https://i-blog.csdnimg.cn/direct/36e0d21421654d338be26dd5b1b5b2cb.png" alt="在这里插入图片描述" />
方法中通过openfeign调用ghost服务
测试结果
https://i-blog.csdnimg.cn/direct/bf36dae547b24ee4a908c4901e53d220.png" alt="在这里插入图片描述" />