如何@autowired一个由webtestclient在@webfluxtest中调用的测试控制器?

ymdaylpp  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(286)

我有一个只用于测试虚拟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")...
  }
}

当我尝试运行它时,我的跟踪程序不是自动连线的。
当然,如果我把我的测试改成@springboottest,一切都可以

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

但我希望避免自动连接整个spring应用程序。如何让testcontroller自动配置?

f4t66c6m

f4t66c6m1#

这个 @WebFluxTest 注解仅使用相关bean的子集填充spring testcontext:
@webfluxtest自动配置spring-webflux基础结构,并将扫描的bean限制为@controller、@controlleradvice、@jsoncomponent、converter、genericconverter、webfilter和webfluxconfigure。使用@webfluxtest注解时,不扫描常规@component和@configurationproperties bean@enableconfigurationproperties可用于包含@configurationproperties bean。来自spring引导文档
你的 Tracer 不会成为这个开箱即用的testcontext的一部分。
为了你的 @WebFluxTest 您可以使用 @MockBean :

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

  @MockBean
  private Tracer tracer;

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

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

相关问题