Spring 的 WebClient 挂在带有 MockServer 的 bodyToMono(Pojo) 上
Spring's WebClient hanging on bodyToMono(Pojo) with MockServer
我想模拟一个外部 API,我正在调用它作为我服务的一部分。因此,我想使用 okhttp3 中的 MockWebServer
。我的问题是,如果我想将正文作为字符串检索,那么对 bodyToMono
的调用工作正常,但在将其作为数据 class 检索时不起作用。我尝试使用以下代码片段 trim 将其关闭:
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
) 工作正常并且 return 正确的 json 表示。但是,第二个测试 (classDoesNotWork
) 在 bodyToMono
调用时永远挂起。
我的猜测是它与 okttp3 库没有直接关系,因为我在使用 Wiremock 时遇到了同样的错误。但是,当以真实的 API 端点为目标时,相同的代码仍然有效。不幸的是,我找不到另一种方法来使用 WebClient
测试我的调用,因为 Spring 目前没有对它的直接模拟支持(参见 SPR-15286)。
我真的很期待在这件事上提供帮助!提前致谢!
中测试用例shouldReceiveJsonAsPojo
的或多或少的副本
好的,在查看了链接测试并做了一些比较之后,我找到了解决方案(或者说是我的错误):我忘记了正确的 Content-Type
header。所以它可以使用以下内容:
private void createMockedTokenCall() {
server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{\"accessToken\":\"BARBAR\",\"refreshToken\":\"FOOFOO\"}"));
}
除了我犯了一个错误,我真的认为这不应该导致应用程序无限挂起...
我想模拟一个外部 API,我正在调用它作为我服务的一部分。因此,我想使用 okhttp3 中的 MockWebServer
。我的问题是,如果我想将正文作为字符串检索,那么对 bodyToMono
的调用工作正常,但在将其作为数据 class 检索时不起作用。我尝试使用以下代码片段 trim 将其关闭:
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
) 工作正常并且 return 正确的 json 表示。但是,第二个测试 (classDoesNotWork
) 在 bodyToMono
调用时永远挂起。
我的猜测是它与 okttp3 库没有直接关系,因为我在使用 Wiremock 时遇到了同样的错误。但是,当以真实的 API 端点为目标时,相同的代码仍然有效。不幸的是,我找不到另一种方法来使用 WebClient
测试我的调用,因为 Spring 目前没有对它的直接模拟支持(参见 SPR-15286)。
我真的很期待在这件事上提供帮助!提前致谢!
中测试用例shouldReceiveJsonAsPojo
的或多或少的副本
好的,在查看了链接测试并做了一些比较之后,我找到了解决方案(或者说是我的错误):我忘记了正确的 Content-Type
header。所以它可以使用以下内容:
private void createMockedTokenCall() {
server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{\"accessToken\":\"BARBAR\",\"refreshToken\":\"FOOFOO\"}"));
}
除了我犯了一个错误,我真的认为这不应该导致应用程序无限挂起...