私はwiremockを使用してgithubapiをモックし、サービスのテストを行っています。このサービスはgithubapiを呼び出します。テストでは、エンドポイントプロパティをに設定しています
_github.api.endpoint=http://localhost:8087
_
このホストとポートはwiremockサーバー@AutoConfigureWireMock(port = 8087)
と同じであるため、不正な応答、タイムアウトなどのさまざまなシナリオをテストできます。
このポートを動的にして、システムですでに使用されている場合を回避するにはどうすればよいですか?テストでワイヤーモックポートを取得し、エンドポイントプロパティを再割り当てする方法はありますか?
_@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();
もう1つの方法は、競合することなく動的ポートを使用できることです。
import org.springframework.util.SocketUtils;
int WIREMOCK_PORT = SocketUtils.findAvailableTcpPort();
public WireMockRule wireMockServer = new WireMockRule(WIREMOCK_PORT);
プロパティファイルからアクセスする場合は、wiremock.server.port
Wiremock提供
"github.api.endpoint=http://localhost:${wiremock.server.port}"
@AutoConfigureWireMock
はわかりませんが、手動でワイヤーモックを起動してモックを設定する場合は、スプリングを起動するときに、スプリングランダムを利用してランダムなポート番号を設定できます。サンプルは次のようになります
あなたのワイヤーモッククラスで
@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}