@TestConfiguration定义的Mock Bean还原为真实实现问题排查
问题排查:Mock仓库未生效,真实仓库被加载
我在测试中配置了Mock仓库的TestConfiguration(代码如下),测试类也导入了该配置,且日志显示mock profile已激活,但运行测试时postRepository还是被真实实现替代了,恳请帮忙排查。
配置类代码
@TestConfiguration public class RepositoryTestConfig { private final User mockAuthor = new User(new ObjectId("6795b64f525959be00d07c0b"), "rbelmont", "Richter", "Belmont", "rbelmont@xyz.com", false); private final Post mockPost = new Post("how to gitgood part two", "you just have to grind 3 hours everyday", mockAuthor.getUsername(), LocalDateTime.now(), LocalDateTime.now(), false, false); @Bean @Profile("mock") public UserRepository mockUserRepository() { return mock(UserRepository.class); } @Bean @Profile("mock") public PostRepository mockPostRepository() { PostRepository postRepository = mock(PostRepository.class); when(postRepository.save(any())).thenReturn(Mono.just(mockPost)); return postRepository; } }
测试类代码
@SpringBootTest @Import(RepositoryTestConfig.class) public class PostServiceTest { @Test void createNewPostThenArchiveIt() { Post postToBeArchived = new Post("test archiving a post", "Help keep the library tidy by returning your dishes to the cafe", author.getUsername(), LocalDateTime.now(), LocalDateTime.now(), false, false); postRepository.save(postToBeArchived).block(); StepVerifier.create(postService.archivePost(postToBeArchived).single()) .expectNextMatches(p -> p.getIsArchived() == true) .verifyComplete(); } }
日志信息
The following 1 profile is active: "mock"
排查方向与解决方案
Bean优先级问题:Spring会优先选择名称与依赖注入点匹配的Bean。你的Mock Bean方法名为
mockPostRepository,而Spring Data自动生成的真实Bean默认名为postRepository,导致真实Bean被注入。解决方式:
给Mock Bean添加@Primary注解,确保它被优先选中:@Bean @Profile("mock") @Primary public PostRepository mockPostRepository() { PostRepository postRepository = mock(PostRepository.class); when(postRepository.save(any())).thenReturn(Mono.just(mockPost)); return postRepository; }或者将Mock Bean的方法名改为
postRepository,与依赖注入的名称保持一致。显式激活Mock Profile:虽然日志显示
mockProfile已激活,但在测试类上显式声明更稳妥,避免Profile激活逻辑出现隐性问题:@SpringBootTest @Import(RepositoryTestConfig.class) @ActiveProfiles("mock") public class PostServiceTest { // 测试代码 }排除真实Repository的扫描:如果
@SpringBootTest的组件扫描范围包含了真实的PostRepository,即使有Mock配置,真实Bean仍可能被创建。在测试类上添加排除规则:@SpringBootTest @Import(RepositoryTestConfig.class) @ActiveProfiles("mock") @ComponentScan(excludeFilters = @ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = PostRepository.class )) public class PostServiceTest { // 测试代码 }检查注入逻辑:确保测试类中的
postRepository是通过@Autowired或构造方法注入的,而非手动实例化了真实的Repository实现。同时验证Mockito的Mock逻辑是否正确,比如save方法的返回值是否符合预期,避免因Mock行为不符合预期而误以为真实Bean被调用。
内容的提问来源于stack exchange,提问作者lulski gonzales
相关产品推荐
相关产品推荐

