使用 Stub Runner 启动应用

警告

由于当前工件仓库发布工具的限制,我们目前无法发布可执行的jar,并且4.1.6我们跳过了这件神器的释放。Stub Runner Boot 仍然可以通过 Docker Stub Runner Boot 镜像使用,这是使用该应用的首选方式。你也可以访问项目仓库中的源代码,自己构建应用。如果在工件仓库工具中完成了必要的调整,我们将恢复发布这个罐子。spring-doc.cadn.net.cn

Spring Cloud Contract Stub Runner Boot 是一个 Spring Boot 应用程序,可以将 REST 端点暴露于 触发消息标签并访问WireMock服务器。spring-doc.cadn.net.cn

Stub Runner 启动安全

Stub Runner Boot 应用设计上并非安全——要保护它需要对所有应用增加安全性 即使实际上不需要,也要写存根。由于这是一个测试工具,服务器并非用于生产环境。spring-doc.cadn.net.cn

预计只有受信任的客户端才能访问 Stub Runner 启动服务器。你不应该 在不可信任的位置运行该应用,作为 Fat Jar 或 Docker 镜像

存根跑者服务器

要使用存根运行服务器,需添加以下依赖:spring-doc.cadn.net.cn

compile "org.springframework.cloud:spring-cloud-starter-stub-runner"

然后对类进行注释@EnableStubRunnerServer,做一个肥罐,它就准备好工作了。spring-doc.cadn.net.cn

有关房产,请参见“短跑者泉水”部分。spring-doc.cadn.net.cn

Stub Runner 服务器胖罐

你可以从 Maven 下载独立的 JAR(例如,版本 2.0.1.RELEASE)。 通过执行以下命令:spring-doc.cadn.net.cn

$ wget -O stub-runner.jar 'https://search.maven.org/remotecontent?filepath=org/springframework/cloud/spring-cloud-contract-stub-runner-boot/2.0.1.RELEASE/spring-cloud-contract-stub-runner-boot-2.0.1.RELEASE.jar'
$ java -jar stub-runner.jar --spring.cloud.contract.stubrunner.ids=... --spring.cloud.contract.stubrunner.repositoryRoot=...

Spring Cloud CLI

1.4.0.发布Spring Cloud CLI 项目的版本,你可以通过运行来启动 Stub Runner Boot春云短跑者.spring-doc.cadn.net.cn

为了传递配置,你可以创建一个spring.cloud.contract.stubrunner.yml当前工作目录中的文件, 在一个名为配置,或在~/.春云.该文件可能如下内容 本地安装存根的示例:spring-doc.cadn.net.cn

例子1。stubrunner.yml
spring.cloud.contract.stubrunner:
  stubsMode: LOCAL
  ids:
    - com.example:beer-api-producer:+:9876

然后你可以打电话春云短跑者从你的终端窗口开始 Stub Runner服务器。端口可获得8750.spring-doc.cadn.net.cn

端点

Stub Runner Boot 提供两个端点:spring-doc.cadn.net.cn

HTTP

对于 HTTP,Stub Runner Boot 提供了以下端点:spring-doc.cadn.net.cn

  • 获取/存根返回所有运行存根的列表常春藤:整数表示法spring-doc.cadn.net.cn

  • 获取/小作品/{常春藤}返回给定的端口常春藤符号(调用端点时)常春藤也可以是artifactId(遗物ID仅此而已)spring-doc.cadn.net.cn

消息

对于消息传递,Stub Runner Boot 提供了以下端点:spring-doc.cadn.net.cn

  • 获取/触发器返回所有运行标签的列表艾薇:[标签1,标签2......]表示法spring-doc.cadn.net.cn

  • 发布/触发器/{label}: 运行触发器标签spring-doc.cadn.net.cn

  • 发布/触发器/{ivy}/{label}: 运行一个带有标签对于给定的常春藤表示法 (当调用端点时,常春藤也可以是artifactId(遗物ID仅此而已)spring-doc.cadn.net.cn

示例

以下示例展示了 Stub Runner Boot 的典型使用情况:spring-doc.cadn.net.cn

@SpringBootTest(classes = StubRunnerBoot, properties = "spring.cloud.zookeeper.enabled=false")
@ActiveProfiles("test")
class StubRunnerBootSpec {

	@Autowired
	StubRunning stubRunning

	@BeforeEach
	void setup() {
		RestAssuredMockMvc.standaloneSetup(new HttpStubsController(stubRunning),
				new TriggerController(stubRunning))
	}

	@Test
	void 'should return a list of running stub servers in "full ivy port" notation'() {
		when:
			String response = RestAssuredMockMvc.get('/stubs').body.asString()
		then:
			def root = new JsonSlurper().parseText(response)
			assert root.'org.springframework.cloud.contract.verifier.stubs:bootService:0.0.1-SNAPSHOT:stubs' instanceof Integer
	}

	@Test
	void 'should return a port on which a #stubId stub is running'() {
		given:
		def stubIds = ['org.springframework.cloud.contract.verifier.stubs:bootService:+:stubs',
				   'org.springframework.cloud.contract.verifier.stubs:bootService:0.0.1-SNAPSHOT:stubs',
				   'org.springframework.cloud.contract.verifier.stubs:bootService:+',
				   'org.springframework.cloud.contract.verifier.stubs:bootService',
				   'bootService']
		stubIds.each {
			when:
				def response = RestAssuredMockMvc.get("/stubs/${it}")
			then:
				assert response.statusCode == 200
				assert Integer.valueOf(response.body.asString()) > 0
		}
	}

	@Test
	void 'should return 404 when missing stub was called'() {
		when:
			def response = RestAssuredMockMvc.get("/stubs/a:b:c:d")
		then:
			assert response.statusCode == 404
	}

	@Test
	void 'should return a list of messaging labels that can be triggered when version and classifier are passed'() {
		when:
			String response = RestAssuredMockMvc.get('/triggers').body.asString()
		then:
			def root = new JsonSlurper().parseText(response)
			assert root.'org.springframework.cloud.contract.verifier.stubs:bootService:0.0.1-SNAPSHOT:stubs'?.containsAll(["return_book_1"])
	}

	@Test
	void 'should trigger a messaging label'() {
		given:
			StubRunning stubRunning = Mockito.mock(StubRunning)
			RestAssuredMockMvc.standaloneSetup(new HttpStubsController(stubRunning), new TriggerController(stubRunning))
		when:
			def response = RestAssuredMockMvc.post("/triggers/delete_book")
		then:
			response.statusCode == 200
		and:
			Mockito.verify(stubRunning).trigger('delete_book')
	}

	@Test
	void 'should trigger a messaging label for a stub with #stubId ivy notation'() {
		given:
			StubRunning stubRunning = Mockito.mock(StubRunning)
			RestAssuredMockMvc.standaloneSetup(new HttpStubsController(stubRunning), new TriggerController(stubRunning))
		and:
			def stubIds = ['org.springframework.cloud.contract.verifier.stubs:bootService:stubs', 'org.springframework.cloud.contract.verifier.stubs:bootService', 'bootService']
		stubIds.each {
			when:
				def response = RestAssuredMockMvc.post("/triggers/$it/delete_book")
			then:
				assert response.statusCode == 200
			and:
				Mockito.verify(stubRunning).trigger(it, 'delete_book')
		}

	}

	@Test
	void 'should throw exception when trigger is missing'() {
		when:
		BDDAssertions.thenThrownBy(() -> RestAssuredMockMvc.post("/triggers/missing_label"))
		.hasMessageContaining("Exception occurred while trying to return [missing_label] label.")
		.hasMessageContaining("Available labels are")
		.hasMessageContaining("org.springframework.cloud.contract.verifier.stubs:loanIssuance:0.0.1-SNAPSHOT:stubs=[]")
		.hasMessageContaining("org.springframework.cloud.contract.verifier.stubs:bootService:0.0.1-SNAPSHOT:stubs=")
	}

}

带服务发现功能的Stub Runner Boot

使用Stub Runner Boot的一种方法是将其作为“烟雾测试”的短片素材。那是什么意思? 假设你不想按顺序向测试环境部署50个微服务 看看你的申请是否有效。你已经在构建过程中运行了一系列测试, 但你也希望确保你的应用包装能够有效。您可以 把你的应用部署到一个环境中,启动它,然后对它运行几个测试,看看是否 它有效。我们可以称这些测试为“烟雾测试”,因为它们的目的是只检查少数几个 测试场景。spring-doc.cadn.net.cn

这种方法的问题在于,如果你使用微服务,你很可能也 使用服务发现工具。Stub Runner Boot 可以通过启动 需要存根并在服务发现工具中注册。spring-doc.cadn.net.cn

现在假设我们想启动这个应用程序,使存根自动注册。 我们可以通过运行应用程序来实现Java -jar ${SYSTEM_PROPS} stub-runner-boot-eureka-example.jar哪里${SYSTEM_PROPS}.spring-doc.cadn.net.cn

这样,你部署的应用程序可以通过服务向启动的 WireMock 服务器发送请求 发现。很可能,第1到第3点可以默认设置在application.yml,因为它们不是 很可能会改变。这样,你只需提供一份存根列表,供你在开始时下载 短跑靴。spring-doc.cadn.net.cn