【问题标题】:How to @Autowired a test controller invoked by WebTestClient in @WebFluxTest?如何在@WebFluxTest 中@Autowired 由WebTestClient 调用的测试控制器?
【发布时间】:2021-06-01 15:00:53
【问题描述】:

我有一个控制器,仅用于使用虚拟 api 进行测试

@RestController
public class TestController {
  @Autowired
  private org.springframework.cloud.sleuth.Tracer tracer;

  @GetMapping("/trace")
  public Mono<String> traceTest() {
    ...
  }
}

这是我的测试

@WebFluxTest(controllers = TestController.class)
public MyTest {
  @Autowired
  private WebTestClient webClient;

  @Test
  public void testTrace() {
    webClient.get().uri("/trace")...
  }
}

当我尝试运行它时,我的 Tracer 没有自动连接。

当然,如果我将测试更改为 @SpringBootTest,一切正常

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public MyTest {
  ...
}

但我想避免自动装配我的整个 Spring 应用程序。如何让 TestController 自动配置?

【问题讨论】:

    标签: spring spring-boot spring-webflux


    【解决方案1】:

    @WebFluxTest 注释仅使用相关 bean 的子集填充 Spring TestContext:

    @WebFluxTest 自动配置 Spring WebFlux 基础设施和 将扫描的 bean 限制为 @Controller、@ControllerAdvice、 @JsonComponent、Converter、GenericConverter、WebFilter 和 WebFlux 配置器。常规 @Component 和 @ConfigurationProperties 使用 @WebFluxTest 注释时不会扫描 bean。 @EnableConfigurationProperties 可用于包含 @ConfigurationProperties bean。来自Spring Boot Documentation

    您的 Tracer 不会成为此 TestContext 开箱即用的一部分。

    对于您的 @WebFluxTest,您可以使用 @MockBean 提供此 bean 的模拟版本:

    @WebFluxTest(controllers = TestController.class)
    public MyTest {
      @Autowired
      private WebTestClient webClient;
    
      @MockBean
      private Tracer tracer;
    
      @Test
      public void testTrace() {
        webClient.get().uri("/trace")...
      }
    }
    

    ...如果您想测试完整的集成,我宁愿使用@SpringBootTest

    【讨论】:

    • 我认为使用@MockBean 是一种可以接受的方式,但是没有办法只配置一个Autowired bean吗?
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2015-05-14
    • 1970-01-01
    • 2018-06-18
    • 2017-12-06
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多