Spring 启动 junit5 + 应用程序属性中的配置的提供者测试与契约代理的集成

Provider test integration with pact broker for Spring Boot junit5 + configuration in application properties

pact-jvm-provider-spring 声明对于 junit5 提供程序测试,不需要使用 spring 库。

但是,@PactBroker 注释取决于系统属性。有没有一种方法可以通过 Spring 属性 解析器使它适用于应用程序属性。我尝试创建类似于 SpringEnvironmentResolver.kt 的内容并在上下文设置中使用它。但这没有用。

@Provider("api-provider-app")
@PactBroker
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class PactVerificationTest {
    @LocalServerPort
    private int port;

    @Autowired
    private Environment environment;

    @TestTemplate
    @ExtendWith(PactVerificationInvocationContextProvider.class)
    void testTemplate(Pact pact, Interaction interaction, HttpRequest request,
                  PactVerificationContext context) {
        context.setTarget(new HttpTestTarget("localhost", port));
        context.setValueResolver(new SpringResolver(environment));
        context.verifyInteraction();
    }
}

我得到以下 错误

Invalid pact broker host specified ('${pactbroker.host:}'). Please provide a valid host or specify the system property 'pactbroker.host'.

更新 经过更多搜索后发现 setTarget 不起作用,需要将其移至 @BeforeEach 方法。

@BeforeEach
void setContext(PactVerificationContext context) {
    context.setValueResolver(new SpringResolver(environment));
    context.setTarget(new HttpTestTarget("localhost", port));
}

以下代码片段帮助它与@PactFolder 注释一起工作。但是带有属性的@PactBroker 仍然无法正常工作

Pact-JVM 添加了一个新模块,它扩展了 JUnit5 支持以允许在 Spring 上下文中配置值。参见 https://github.com/DiUS/pact-jvm/tree/master/provider/pact-jvm-provider-junit5-spring。它将与下一个版本的 Pact-JVM 一起发布,即 4.0.7.