0

使用 WebClient 进行 HTTP 调用,从 Mono 输出我想做一些逻辑,为此我使用 flatMap 方法。

        Mono<Response> authResponseMono = webClient.post().syncBody(requestBody)
            .retrieve()
            .bodyToMono(Response.class);

        return authResponseMono.flatMap(authResponse -> {
        //code removed for brevity
        });

使用 OkHttp MockWebServer 库来模拟响应并对功能进行单元测试。该flatMap方法在使用 MockWebServer 时没有被调用,但是,在实际调用中一切正常。

以下是用于模拟 HTTP 响应的片段

server.enqueue(mockResponse); //server is instance of MockWebServer
Optional<Response> optionalResponse = authClientService.verifyToken().block(); //verifyToken returns authResponseMono

我认为这种行为的原因是由于 MockWebServer 在内部创建模拟的方式。我在这里想念什么?

4

1 回答 1

0

我使用 MockWebServer 和 webClient ,它似乎很好。也许您可以发布更多详细信息。

这是我的设置片段 - 请注意这不是春季测试

@RunWith(MockitoJUnitRunner.class)
public class AccountDetailsRetrievalTest {

    private static final String ACCOUNT_DETAILS_PATH = "/AccountDetailsPath";
    private MockWebServer server;

    private WebClient webClient;

    private AccountDetailsRetrieval accountDetailsRetrieval;

    @Before
    public void setup() {
        this.server = new MockWebServer();
        this.webClient = WebClient.create(this.server.url(ACCOUNT_DETAILS_PATH).toString());
        accountDetailsRetrieval = new AccountDetailsRetrieval(this.webClient, ACCOUNT_DETAILS_PATH, 300);
    }

    @After
    public void shutdown() throws Exception {
        this.server.shutdown();
    }

@Test
public void nameHasBeenChanged() {
    String content = "{\"bar\":\"bar1\",\"foo\":\"foo1\"}";
    MockResponse response1 = new MockResponse()
            .setHeader("Content-Type", "application/json")
            .setBody(content);
    this.server.enqueue(response1);

    StepVerifier.create(accountDetailsRetrieval.getAccountData(new AccountDetails("001", "ABC")))
            .assertNext(response -> {
                assertThat(response).isNotNull();
                assertThat(response.getHttpStatus()).isEqualByComparingTo(HttpStatus.OK);
                assertThat(response.data().get("bar")).isEqualTo("bar1");
                assertThat(response.data().get("foo")).isEqualTo("foo1");
            })
            .verifyComplete();
}

这里的响应只是 JsonNode 的一个包装器

于 2018-11-20T23:58:28.957 回答