繁体   English   中英

如何在@WebFluxTest 中@Autowired 由WebTestClient 调用的测试controller?

[英]How to @Autowired a test controller invoked by WebTestClient in @WebFluxTest?

我有一个 Controller 仅用于使用虚拟 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 自动配置?

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

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

您的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM