首页 > 解决方案 > 如何在测试中创建多个 MockMvc 对象?

问题描述

我有一个这样注释的 Spring 测试

@AutoConfigureMockMvc
@WebMvcTest
public class StepDefinitions {

  @Autowired
  private MockMvc mockMvc;

在测试中,我使用mockMvc.perform(post("/api/....

我通过调用等效项来验证它mockMvc.perform(get("/api/....

但是,我正在使用分布式数据库,现在想检查记录是否存储在另一个数据库中,并通过对不同后端的获取请求。

如何创建第二个 MockMvc 实例,该实例链接到一组不同的后端控制器和服务,以便我可以在同一个测试中同时使用它们?

编辑:

一种选择是不使用AutoConfigureMockMvc,而是指定我的上下文配置,而不是使用MockMvc定义的多个 beanQualifiers

@ContextConfiguration(classes = TestConfiguration.class)
@WebMvcTest
public class StepDefinitions {

  @Autowired
  @Qualifier("firstMockMvc")
  private MockMvc firstMockMvc;

测试配置

@Bean
@Qualifier("firstMockMvc")
public MockMvc firstMockMvc(@Qualifier("firstController") MyController myController) {
  return MockMvcBuilders.standaloneSetup(myController).build();
}


@Bean
@Qualifier("secondMockMvc")
public MockMvc secondMockMvc(@Qualifier("secondController") MyController myController) {
  return MockMvcBuilders.standaloneSetup(myController).build();
}

但是,这会导致WebMvcTest配置出现问题。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'firstController' method 
public org.springframework.http.ResponseEntity<java.util.List<com.my.app.web.dto.DataDTO>> com.my.app.web.rpc.MyController.getEmployees()
to {GET /api/employees/employees, produces [application/json]}: There is already 'firstController' bean method
public org.springframework.http.ResponseEntity<java.util.List<com.my.app.web.dto.DataDTO>> com.my.app.web.rpc.MyController.getEmployees() mapped.

这似乎我将不得不手动连接我的整个 Web 配置。

有没有更简单的方法来做到这一点?

标签: spring-boottesting

解决方案


使用编辑中提到的注释创建 MockMvc beanMockMvcBuilders.standaloneSetup并添加@Qualifier注释是解决方案的一部分。

另一部分是删除@WebMvcTest@ComponentScan以便主包中的 Controller bean 不会被加载并导致Ambiguous mapping错误。

我必须为我的控制器和服务添加 bean,但不必为底层的 Spring bean 做任何额外的连接(除了 MockMvc)。


推荐阅读