使用 jUnit5 和 Spring Boot 的随机端口进行契约测试

Pact testing using random port with jUnit5 and SpringBoot

使用 jUnit5 时,我无法在除 8080 以外的任何其他端口上将协议提供程序测试发送到 运行。我有以下代码:

@ExtendWith(SpringExtension.class)
@Provider(PROVIDER)
@PactFolder("pacts")
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class PactProviderTest {

  @LocalServerPort private int serverPort;

  @Autowired Result<IServiceManagementFacade2> serviceManagementFacade;

  @Autowired private RestServiceFactory restServiceFactory;

  @TestTemplate
  @ExtendWith(PactVerificationInvocationContextProvider.class)
  void pactVerificationTestTemplate(PactVerificationContext context) {
    context.setTarget(new HttpTestTarget("localhost", serverPort));
    context.verifyInteraction();
  }

当我 运行 出现以下错误时:

Request Failed - Connect to localhost:8080 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused (Connection refused)

如果我改变

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)

测试通过。但是在测试期间,没有其他应用程序可以 运行ning 在该端口上,这在测试环境中是不可接受的。有什么办法可以解决这个问题吗?

我设法解决了。

移动线路:

context.setTarget(new HttpTestTarget("localhost", serverPort));

@BeforeEach 解决了这个问题。它不起作用然后我之前尝试这样做的原因是因为我使用了一个变量来设置它。

所以做这样的事情:

  @LocalServerPort private int serverPort;
  private HttpTestTarget target = new HttpTestTarget("localhost", serverPort);

  @TestTemplate
  @ExtendWith(PactVerificationInvocationContextProvider.class)
  void pactVerificationTestTemplate(PactVerificationContext context) {
    context.verifyInteraction();
  }

  @BeforeEach
  void setTarget(PactVerificationContext context) {
    context.setTarget(target);
  }

无效。

但这确实有效:

  @LocalServerPort private int serverPort;

  @TestTemplate
  @ExtendWith(PactVerificationInvocationContextProvider.class)
  void pactVerificationTestTemplate(PactVerificationContext context) {
    context.verifyInteraction();
  }

  @BeforeEach
  void setTarget(PactVerificationContext context) {
    context.setTarget(new HttpTestTarget("localhost", serverPort));
  }