我使用SpringBoot和Java为我的API编写e2e测试,在这个流程中,我对存储API(S3)进行HTTP调用,并使用MockServer模拟它。
这是HttpClient以及我如何创建我的post请求:
public class HttpClient {
private final String baseUrl;
public <T> Mono<T> post(final String path, String body, Class<T> responseType) {
return WebClient.builder()
.baseUrl(baseUrl) // localhost:1082
.build()
.post()
.uri(path)
.bodyValue(body)
.accept(MediaType.APPLICATION_JSON)
...
下面是我配置模拟服务器的方法:
public class CommonMockServerHelpers {
private static MockServerClient mockServerClientStorage = new MockServerClient("localhost", 1082).reset();
public static MockServerClient getClientStorage() {
return mockServerClientStorage;
}
public static void verify(String path, String exceptedRequestBody, int times) {
Awaitility.await()
.atMost(Duration.ofSeconds(60))
.untilAsserted(() ->
verify(getClientStorage(), path, exceptedRequestBody, times)
);
}
public static void verify(MockServerClient client, String path, String exceptedRequestBody, int times) {
client.verify(buildPostRequest()
.withBody(subString(exceptedRequestBody))
.withPath(path), VerificationTimes.exactly(times));
}
在我的测试中,我使用RestTemplate
进行API HTTP调用。在一个测试中,此验证应该通过:
CommonMockServerHelpers.verify("/save-file", "FAILED", 0);
而另一方面则不应该。当运行测试时,它们会发生冲突并使彼此失败。是否有一种方法可以为每个测试创建一些唯一性,以便我能够验证测试的MockServer调用,而不会干扰其他测试?
1条答案
按热度按时间gzszwxb41#
你应该在每个测试用例中写下期望值,就像这样:
首先执行
reset()
是很重要的,因为这些期望值由mockServer保存,否则将导致不可靠的测试。如果愿意,可以在@beforeEach
-方法中执行reset()
。