如何在JUnit 5测试中自动装配(Autowire)Repository?
JUnit 5测试中注入Spring Bean的正确姿势
你的测试类里messageRepository为null,是因为JUnit默认不会自动启动Spring容器,你加的@ComponentScan、@EnableJpaRepositories这些注解只是普通注解,没有被Spring上下文处理,自然无法完成依赖注入。
不需要每个测试类都手动实例化ApplicationContext,用Spring提供的测试注解就能轻松解决:
方案1:复用主配置类
直接在测试类上添加@SpringJUnitConfig注解,指定你的主类TestSpringApplication作为配置类,JUnit会自动启动Spring容器并完成Bean注入:
@SpringJUnitConfig(classes = TestSpringApplication.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class TestMessageRepository { @Autowired private MessageRepository messageRepository; @Test @Order(1) void testFindAllEmpty() { assertFalse(messageRepository.findAll().iterator().hasNext()); } }
方案2:创建独立测试配置类
如果不想让测试依赖主类,可以单独写一个测试专用的配置类,把组件扫描、JPA仓库启用的配置集中在这里:
@Configuration @ComponentScan(basePackages = "com.cypherf") // 替换成你的实际业务包路径 @EnableJpaRepositories(basePackages = "com.cypherf.repository") // 替换成仓库所在包路径 public class TestConfig { }
然后测试类引用这个配置:
@SpringJUnitConfig(classes = TestConfig.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class TestMessageRepository { @Autowired private MessageRepository messageRepository; @Test @Order(1) void testFindAllEmpty() { assertFalse(messageRepository.findAll().iterator().hasNext()); } }
关键说明
@SpringJUnitConfig是JUnit 5与Spring测试整合的核心注解,它会负责启动Spring应用上下文,并将测试类纳入Spring容器管理,这样@Autowired就能正常工作。- Spring测试框架会自动缓存已启动的容器,后续测试类如果使用相同配置,不会重复启动容器,不会影响测试效率。
内容的提问来源于stack exchange,提问作者Gaetan L.
相关产品推荐
相关产品推荐

