如何在Spring Boot的@WebMvcTest测试中使用@ActiveProfiles?
解决@WebMvcTest中Profile配置类无法加载Mock Bean的问题
我一眼就发现了导致你报错的核心问题——Profile名称拼写不一致!
你的配置类上标注的是@Profile("mockService"),但测试类的@ActiveProfiles指定的是"mockServices"(末尾多了一个s)。Spring找不到对应Profile的配置类,自然不会创建Mock版本的VotingService Bean,最终抛出NoSuchBeanDefinitionException。
下面是完整的修复步骤:
1. 统一Profile名称
先把配置类和测试类的Profile名称改成一致,比如都用"mockServices":
修正后的配置类:
@Profile("mockServices") @Configuration public class NotificationServiceTestConfiguration { @Bean @Primary public VotingService getVotingService() { return Mockito.mock(VotingService.class); } }
测试类的@ActiveProfiles保持不变:
@ActiveProfiles("mockServices") @RunWith(SpringRunner.class) @WebMvcTest(VoteController.class) public class VoteControllerTest { // ... 你的测试代码 }
2. 确保配置类被Spring扫描到
@WebMvcTest默认只会扫描控制器所在的包,如果你的NotificationServiceTestConfiguration不在测试类的同包或子包下,Spring无法自动发现它。这时候需要手动导入配置类:
@ActiveProfiles("mockServices") @RunWith(SpringRunner.class) @WebMvcTest(VoteController.class) @Import(NotificationServiceTestConfiguration.class) // 手动导入测试配置 public class VoteControllerTest { // ... 你的测试代码 }
3. 验证@Primary的优先级(可选但推荐)
如果你的真实VotingService Bean没有指定Profile(即默认加载),那么激活mockServices时,真实Bean和Mock Bean都会存在。@Primary注解能确保Spring优先注入Mock版本的Bean,避免依赖注入冲突。
完成以上步骤后,Spring就能正确加载你的Mock配置类,创建VotingService的Mock实例并注入到VoteController中,解决Bean找不到的问题。
内容的提问来源于stack exchange,提问作者srowley
相关产品推荐
相关产品推荐

