Stub Runner JUnit Rule and Stub Runner JUnit5 Extension

Stub Runner 带有一个 JUnit 规则,它允许您可以下载并运行给定组和工件 ID 的存根,如下面的示例所示:

link:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleJUnitTest.java[role=include]

JUnit 5 也提供了一个 StubRunnerExtensionStubRunnerRuleStubRunnerExtension 的工作方式非常类似。在调用规则或扩展后,Stub Runner 会连接到你的 Maven 存储库,并尝试针对给定的依赖项列表执行以下操作:

  • Download them

  • Cache them locally

  • 将它们解压缩到临时文件夹

  • 为随机端口上的每个 Maven 依赖项启动一个 WireMock 服务器,该端口取自提供的端口范围或提供的端口

  • 使用所有有效的 WireMock 定义的 JSON 文件为 WireMock 服务器提供信息

  • 发送消息(请记住传递 MessageVerifierSender 接口的实现)

Stub Runner 使用 Eclipse Aether 机制下载 Maven 依赖项。查看其 docs 以了解更多信息。 由于 StubRunnerRuleStubRunnerExtension 实现了 StubFinder,你可以像以下示例所示那样查找启动的 Stub:

link:{stubrunner_core_path}/src/main/java/org/springframework/cloud/contract/stubrunner/StubFinder.java[role=include]

以下示例提供了关于使用 Stub Runner 的更多详细信息:

Spock
link:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleSpec.groovy[role=include]
Junit 4
link:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleJUnitTest.java[role=include]
Junit 5
link:{stubrunner_core_path}/src/test/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerJUnit5ExtensionTests.java[role=include]

请参阅 Common Properties for JUnit and Spring 以了解有关如何应用 Stub Runner 的全局配置的更多信息。

要将junit规则或junit 5扩展与消息传递一起使用,必须为规则生成器(例如`rule.messageVerifierSender(new MyMessageVerifierSender())`)提供`MessageVerifierSender`和`MessageVerifierReceiver`界面的实现。如果不这样做,那么每当尝试发送消息时就会引发异常。

Maven Settings

Stub 下载器尊重使用其他本地存储库文件夹的 Maven 设置。目前不会考虑存储库和配置文件的身份验证详细信息,因此你需要使用上述属性来指定它。

Providing Fixed Ports

你还可以使用固定端口运行 Stub。你可以采用两种不同的方式实现。一种是将其传递到属性中,另一种是使用 JUnit 规则的 Fluent API。

Fluent API

当使用 StubRunnerRuleStubRunnerExtension 时,你可以添加要下载的 Stub,然后传递最后一个下载的 Stub 的端口。以下示例展示了如何执行此操作:

link:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleCustomPortJUnitTest.java[role=include]

对于前面的示例,以下测试有效:

link:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleCustomPortJUnitTest.java[role=include]

Stub Runner with Spring

带 Spring 的 Stub Runner 会设置 Stub Runner 项目的 Spring 配置。

通过在配置文件中提供一个 Stub 列表,Stub Runner 会自动下载并 WireMock 中注册选定的 Stub。

如果你希望查找 Stub 依赖项的 URL,你可以自动装入 StubFinder 接口并使用它的方法,如下所示:

link:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy[role=include]

这样做取决于以下配置文件:

link:{stubrunner_core_path}/src/test/resources/application-test.yml[role=include]

除了使用属性,你还可以使用 @AutoConfigureStubRunner 中的属性。以下示例通过在注释中设置值来实现相同的结果:

link:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy[role=include]

Stub Runner Spring 以下述方式为每个已注册的 WireMock 服务器注册环境变量。以下示例展示了 com.example:thing1com.example:thing2 的 Stub Runner ID:

  • stubrunner.runningstubs.thing1.port

  • stubrunner.runningstubs.com.example.thing1.port

  • stubrunner.runningstubs.thing2.port

  • stubrunner.runningstubs.com.example.thing2.port

你可以在你的代码中引用这些值。

你还可以使用 @StubRunnerPort 注释来注入正在运行的 Stub 的端口。此注释的值可以是 groupid:artifactid 或者仅是 artifactid。以下示例展示了 com.example:thing1com.example:thing2 的 Stub Runner ID。

@StubRunnerPort("thing1")
int thing1Port;
@StubRunnerPort("com.example:thing2")
int thing2Port;