我正在尝试一些可能被误导的东西,但请帮助我。
我想通过@WebFluxTest
测试一下springboot控制器。但是,我想使用WebClient
而不是WebTestClient
。如何做到这一点?
到目前为止,我已经成功地使用反射将ExchangeFunction
从WebTestClient中提取出来,并将其赋值给WebClient --而且它是有效的!呼叫发出后,控制器做出响应--太棒了。然而,我不认为这是一个好的方法。有没有更好的方法?
谢谢。
发布于 2021-08-31 17:36:38
理想情况下,您应该在WebClient
周围使用更方便的包装器WebTestClient
。就像RestTemplate
的TestRestTemplate
一样。两者都允许创建请求,并且您可以轻松地进行断言。它们的存在是为了让你的测试生活变得更容易。
如果您真的想使用WebClient
而不是WebTestClient
并手动执行断言(这意味着您可能会使事情复杂化),您可以使用WebClient.Builder
来创建一个断言。Spring Boot将自动配置一个,您可以简单地在测试中自动配置它并调用build
方法。
@SpringBootTest
public void YourTest {
@Autowired
private WebClient.Builder webClientBuilder;
@Test
public void doTest() {
WebClient webClient = webClientBuilder.build();
}
}
同样的道理也适用于@WebFluxTest
。
发布于 2021-09-02 12:37:08
好的,经过大量的实验,这里是一个通过模拟连接测试springboot控制器和过滤器的解决方案-没有网络服务,没有端口和快速测试。
不幸的是,我不知道如何通过@WebFluxTest
和WebClient
做到这一点,相反,MockMvc
可以用来达到预期的效果:
@ExtendWith(SpringExtension.class)
@Import({SomeDependencyService.class, SomeFilter.class})
@WebMvcTest(controllers = SomeController.class, excludeAutoConfiguration = SecurityAutoConfiguration.class)
@AutoConfigureMockMvc()
public class SomeControllerTest {
@MockBean
private SomeDependencyService someDependencyService;
@Autowired
private MockMvc mockMvc;
private SomeCustomizedClient subject;
@BeforeEach
public void setUp() {
subject = buildClient();
WebClient webClient = mockClientConnection();
subject.setWebClient(webClient);
}
private WebClient mockClientConnection() {
MockMvcHttpConnector mockMvcHttpConnector = new MockMvcHttpConnector(mockMvc);
WebClient webClient = WebClient.builder().clientConnector(mockMvcHttpConnector).build();
return webClient;
}
@Test
public void sample() {
when(SomeDependencyService.somePersistentOperation(any(), any())).thenReturn(new someDummyData());
SomeDeserializedObject actual = subject.someCallToControllerEndpoint("example param");
assertThat(actual.getData).isEquals("expected data");
}
}
现在,可以以单元测试为代价测试您的自定义客户端(例如,如果您的内部java客户端包含一些重要的自定义,如安全性、etags、日志记录、反序列化和统一错误处理)和相关的控制器(以及过滤器,如果您使用@import
的话)。
您不必启动整个服务来验证客户端和控制器是否正常工作。
https://stackoverflow.com/questions/69000217
复制相似问题