【问题标题】:Spring's WebClient hanging on bodyToMono(Pojo) with MockServerSpring 的 WebClient 使用 MockServer 挂在 bodyToMono(Pojo) 上
【发布时间】:2018-11-16 12:58:24
【问题描述】:

我想模拟一个外部 API,我将其作为服务的一部分进行调用。因此,我想使用来自 okhttp3 的MockWebServer。我的问题是对bodyToMono 的调用工作正常,如果我想将正文作为字符串检索,但在将其作为数据类检索时不起作用。我尝试使用以下代码 sn-p 对其进行修剪:

public class MockWebClientTest {

    private MockWebServer server;

    @BeforeEach
    public void setUp() throws IOException {
        server = new MockWebServer();
        server.start(9876);
    }

    @AfterEach
    public void tearDown() throws IOException {
        server.shutdown();
    }

    @Test
    public void stringWorks() throws JsonProcessingException {
        createMockedTokenCall();

        Mono<String> response = WebClient.create(this.server.url("/").toString())
            .get()
            .uri("/")
            .retrieve()
            .bodyToMono(String.class);

        System.out.println(response.block());
    }

    @Test
    public void classDoesNotWork() {
        createMockedTokenCall();

        Mono<AuthToken> response = WebClient.create(this.server.url("/").toString())
            .get()
            .uri("/")
            .retrieve()
            .bodyToMono(AuthToken.class);

        System.out.println(response.block());
    }

    private void createMockedTokenCall() {
        server.enqueue(new MockResponse().setBody("{\"accessToken\":\"BARBAR\",\"refreshToken\":\"FOOFOO\"}"));
    }
}

class AuthToken {
    private String accessToken;
    private String refreshToken;

    //constructor
}

第一个测试 (stringWorks) 工作正常并返回正确的 json 表示。但是,第二个测试 (classDoesNotWork) 在 bodyToMono 调用上永远挂起。

我的猜测是它与 okttp3 库直接无关,因为我在使用 Wiremock 时遇到了同样的错误。然而,当以真正的 API 端点为目标时,相同的代码也可以工作。不幸的是,我找不到另一种使用 WebClient 测试我的调用的方法,因为 Spring 目前没有直接的模拟支持(参见 SPR-15286)。

我真的很期待在这件事上提供帮助!提前致谢!

一般评论:这基本上是https://github.com/spring-projects/spring-framework/blob/master/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java中的测试用例shouldReceiveJsonAsPojo的或多或少的副本

【问题讨论】:

    标签: java spring okhttp3 spring-webflux


    【解决方案1】:

    好的,在查看了链接的测试并进行了一些比较之后,我找到了解决方案(或者可以说是我的错误):我忘记了正确的 Content-Type 标头。所以它使用以下方法工作:

    private void createMockedTokenCall() {
        server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{\"accessToken\":\"BARBAR\",\"refreshToken\":\"FOOFOO\"}"));
    }
    

    除了我犯了一个错误,我真的认为这不应该导致应用程序无限挂起......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-15
      • 2020-08-02
      • 2019-09-27
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2020-07-28
      • 2018-01-07
      相关资源
      最近更新 更多