programing

WireMock 포트를 보다 동적으로 만들어 테스트 서비스에 사용하려면 어떻게 해야 합니까?

closeapi 2023. 9. 23. 22:45
반응형

WireMock 포트를 보다 동적으로 만들어 테스트 서비스에 사용하려면 어떻게 해야 합니까?

저는 wiremock을 사용하여 github api를 모의하여 서비스 테스트를 하고 있습니다.서비스에서 github api를 호출합니다.테스트의 경우 엔드포인트 속성을 다음으로 설정합니다.

github.api.endpoint=http://localhost:8087

이 호스트 및 포트가 wiremock 서버와 동일합니다.@AutoConfigureWireMock(port = 8087)따라서 잘못된 응답, 타임아웃 등과 같은 다양한 시나리오를 테스트할 수 있습니다.

시스템에서 이 포트를 이미 사용하고 있는데 이 포트를 동적으로 설정하려면 어떻게 해야 합니까?테스트에서 wiremock 포트를 가져와 endpoint 속성을 재할당할 수 있는 방법이 있습니까?

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 8087)
@TestPropertySource(properties ={"github.api.endpoint=http://localhost:8087"}) 
public class GithubRepositoryServiceTestWithWireMockServer {

@Value("${github.api.client.timeout.milis}")
private int githubClientTimeout;

@Autowired
private GithubRepositoryService service;

@Test
public void getRepositoryDetails() {
    GithubRepositoryDetails expected = new GithubRepositoryDetails("niemar/xf-test", null,
            "https://github.com/niemar/xf-test.git", 1, "2016-06-12T18:46:24Z");
    stubFor(get(urlEqualTo("/repos/niemar/xf-test"))
            .willReturn(aResponse().withHeader("Content-Type", "application/json").withBodyFile("/okResponse.json")));

    GithubRepositoryDetails repositoryDetails = service.getRepositoryDetails("niemar", "xf-test");

    Assert.assertEquals(expected, repositoryDetails);
}

@Test
public void testTimeout() {
    GithubRepositoryDetails expected = new GithubRepositoryDetails("niemar/xf-test", null,
            "https://github.com/niemar/xf-test.git", 1, "2016-06-12T18:46:24Z");
    stubFor(get(urlEqualTo("/repos/niemar/xf-test"))
            .willReturn(aResponse()
                    .withHeader("Content-Type", "application/json")
                    .withBodyFile("/okResponse.json")
                    .withFixedDelay(githubClientTimeout * 3)));

    boolean wasExceptionThrown = false;
    try {
        GithubRepositoryDetails repositoryDetails = service.getRepositoryDetails("niemar", "xf-test");
    } catch (GithubRepositoryNotFound e) {
        wasExceptionThrown = true;
    }

    Assert.assertTrue(wasExceptionThrown);
}

WireMock 포트를 0으로 설정하여 임의 포트를 선택한 다음 이 포트에 대한 참조를 사용해야 합니다.wiremock.server.port엔드포인트 속성의 일부입니다.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
@TestPropertySource(properties = {
    "github.api.endpoint=http://localhost:${wiremock.server.port}"
}) 
public class GithubRepositoryServiceTestWithWireMockServer {
    ....
}

Spring Cloud Contract WireMock도 참조하십시오.

이것이 좀 오래된 게시물이라는 것을 알지만 여전히 이러한 포트를 동적으로 가질 수 있는 문서화된 방법이 있습니다.여기서 자세히 보기: 시작하기.'랜덤 포트 번호'로 스크롤을 조금만 내리면 됩니다.거기에 있는 설명서에서:

당신이 해야할 일은 규칙을 그렇게 정의하는 것입니다.

@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort().dynamicHttpsPort());  

그리고 그들을 통해 접근합니다.

int port = wireMockRule.port();
int httpsPort = wireMockRule.httpsPort();

충돌 없이 동적 포트를 사용할 수 있는 한 가지 방법은

import org.springframework.util.SocketUtils;

int WIREMOCK_PORT = SocketUtils.findAvailableTcpPort();

public WireMockRule wireMockServer = new WireMockRule(WIREMOCK_PORT);

만약 당신이 속성 파일에서 접근하고 싶다면,wiremock.server.port와이어모크 제공

"github.api.endpoint=http://localhost:${wiremock.server.port}"

나는 알지 못합니다.@AutoConfigureWireMock그러나 수동으로 와이어모킹을 시작하고 모의실험을 설정하는 경우 스프링을 시작하는 동안 스프링 랜덤을 사용하여 랜덤 포트 번호를 설정할 수 있습니다.샘플은 이렇게 보일 것입니다.

너의 wiremock 수업에서

@Component
public class wiremock {
    @Value("${randomportnumber}")
    private int wiremockPort;

   public void startWiremockServer() {
        WireMock.configureFor("localhost", wiremockPort);
        wireMockServer = new com.github.tomakehurst.wiremock.WireMockServer(wireMockConfig().port(wiremockPort).extensions
                (MockedResponseHandler.class));
        wireMockServer.start();
   }

}

시험시간에

//however you want to configure spring
public class wiremock {

    @Value("${github.api.endpoint}")
    private String wiremockHostUrl;

   //use the above url to get stubbed responses.
}

application.properties 파일에서

randomportnumber=${random.int[1,9999]}
github.api.endpoint=http://localhost:${randomportnumber}

사용하시는 경우.NET/C#, 다음과 같이 빈 인수로 WireMock 서버를 시작할 수 있습니다.

var myMockServer = WireMockServer.Start();

다음과 같이 필요한 경우 포트 번호를 가져옵니다.

int portNumber = myMockServer.Port();

언급URL : https://stackoverflow.com/questions/49374115/how-can-i-make-wiremock-port-more-dynamic-to-use-it-for-testing-service

반응형