首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过WebClient代替WebTestClient的Springboot测试控制器

通过WebClient代替WebTestClient的Springboot测试控制器
EN

Stack Overflow用户
提问于 2021-08-31 14:07:07
回答 2查看 226关注 0票数 0

我正在尝试一些可能被误导的东西,但请帮助我。

我想通过@WebFluxTest测试一下springboot控制器。但是,我想使用WebClient而不是WebTestClient。如何做到这一点?

到目前为止,我已经成功地使用反射将ExchangeFunction从WebTestClient中提取出来,并将其赋值给WebClient --而且它是有效的!呼叫发出后,控制器做出响应--太棒了。然而,我不认为这是一个好的方法。有没有更好的方法?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-08-31 17:36:38

理想情况下,您应该在WebClient周围使用更方便的包装器WebTestClient。就像RestTemplateTestRestTemplate一样。两者都允许创建请求,并且您可以轻松地进行断言。它们的存在是为了让你的测试生活变得更容易。

如果您真的想使用WebClient而不是WebTestClient并手动执行断言(这意味着您可能会使事情复杂化),您可以使用WebClient.Builder来创建一个断言。Spring Boot将自动配置一个,您可以简单地在测试中自动配置它并调用build方法。

代码语言:javascript
运行
复制
@SpringBootTest
public void YourTest {
  
  @Autowired
  private WebClient.Builder webClientBuilder;

  @Test
  public void doTest() {
    WebClient webClient = webClientBuilder.build();
  }
}

同样的道理也适用于@WebFluxTest

票数 0
EN

Stack Overflow用户

发布于 2021-09-02 12:37:08

好的,经过大量的实验,这里是一个通过模拟连接测试springboot控制器和过滤器的解决方案-没有网络服务,没有端口和快速测试。

不幸的是,我不知道如何通过@WebFluxTestWebClient做到这一点,相反,MockMvc可以用来达到预期的效果:

代码语言:javascript
运行
复制
@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的话)。

您不必启动整个服务来验证客户端和控制器是否正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69000217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档