Spring Boot 具有测试特定会话ID的MockServer

0tdrvxhp  于 2023-02-16  发布在  Spring
关注(0)|答案(1)|浏览(130)

我使用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调用,而不会干扰其他测试?

gzszwxb4

gzszwxb41#

你应该在每个测试用例中写下期望值,就像这样:

mockServerClientStorage.reset()
    .when(request()
            .withMethod("GET")
            .withPath("/save-file"))
    .respond(response()
            .withStatusCode(200)
            .withBody("Nice!"));
mockServerClientStorage.reset()
    .when(request()
            .withMethod("GET")
            .withPath("/save-file"))
    .respond(response()
            .withStatusCode(500)
            .withBody("I failed!"));

首先执行reset()是很重要的,因为这些期望值由mockServer保存,否则将导致不可靠的测试。如果愿意,可以在@beforeEach-方法中执行reset()

相关问题