首页 > 解决方案 > 如何在@WebFluxTest 中@Autowired 由WebTestClient 调用的测试控制器?

问题描述

我有一个控制器仅用于使用虚拟 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 不是 Autowired。

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

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

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

标签: springspring-bootspring-webflux

解决方案


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

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

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

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

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

  @MockBean
  private Tracer tracer;

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

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


推荐阅读