spring-boot - 如何在测试中创建多个 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 配置。
有没有更简单的方法来做到这一点?
解决方案
使用编辑中提到的注释创建 MockMvc beanMockMvcBuilders.standaloneSetup
并添加@Qualifier
注释是解决方案的一部分。
另一部分是删除@WebMvcTest
,@ComponentScan
以便主包中的 Controller bean 不会被加载并导致Ambiguous mapping
错误。
我必须为我的控制器和服务添加 bean,但不必为底层的 Spring bean 做任何额外的连接(除了 MockMvc)。
推荐阅读
- python - Python Zip 列表到 Dataframe
- sql - SSIS 模式切换死锁
- ruby - 解决运行列表的食谱时出错:缺少食谱:没有这样的食谱'docker'
- jekyll - 获取某个类别的帖子计数,除非他们也没有特定类别
- python - 如何从 BeautifulSoup 中的 td 获得价值?
- javascript - 禁用在移动设备上悬停的需要
- huawei-mobile-services - 华为推送通知-不同优先级推送通知的时间延迟是多少?
- assembly - NASM 错误:非 64 位模式下的无效操作数
- ssis-2019 - 在SSIS中将逗号分隔的字符串列拆分为几行?
- node.js - 在 Dockerfile 中从 BitBucket 安装 node_modules