Spring测试问题:同项目Autowired Bean找不到+无Mock测试Jar中DAO
解决Spring测试中Autowired Bean找不到及DAO真实测试的问题
我来帮你排查下这两个问题,先看你的测试代码,有几个明显的问题需要修正,再一步步解决Autowired找不到Bean的核心问题:
1. 先修复测试方法的基础错误
你的测试方法testAplicationDocumentDao是private的,这会直接导致Spring测试框架无法调用它!@Test注解的方法必须是public访问修饰符,这是第一个要改的点。另外注意你的DAO类名拼写有错误:aplication应该是application,虽然不影响功能,但规范命名能避免后续不必要的混淆。
2. 确保Spring上下文正确加载(核心问题)
你用了@ComponentScan("com.xxxx"),但如果没有正确配置Spring上下文,或者扫描路径没覆盖到目标Bean,就会出现Autowired失败的情况。针对你“不Mock、真实测试Jar包中DAO”的需求,分两种场景给出解决方案:
场景一:你用的是Spring Boot项目
最省心的方式是替换@ComponentScan为@SpringBootTest,它会自动加载整个应用的Spring上下文,包括你Jar包中的DAO类(只要DAO所在的包被Spring Boot的自动扫描覆盖,或者你可以手动指定配置类)。
修正后的测试类示例:
@RunWith(SpringRunner.class) @SpringBootTest public class ApplicationTester { @Autowired private ApplicationDocumentDao applicationDocumentDao; // 修正拼写错误 @Test public void testApplicationDocumentDao() { // 改为public访问修饰符 // 调用DAO方法,建议添加断言验证结果 List<ApplicationDocument> documents = applicationDocumentDao.allForOrg(1); Assert.assertNotNull("查询结果不应为空", documents); } }
场景二:普通Spring项目(非Spring Boot)
需要用@ContextConfiguration指定你的Spring配置类,这个配置类要包含:
- 覆盖DAO所在包的
@ComponentScan - 测试用的数据源配置(比如H2内存数据库,避免连接生产库)
- JPA/Hibernate相关配置(如果你的DAO用了这些技术)
示例代码:
// 测试类 @RunWith(SpringRunner.class) @ContextConfiguration(classes = PersistenceTestConfig.class) public class ApplicationTester { @Autowired private ApplicationDocumentDao applicationDocumentDao; @Test public void testApplicationDocumentDao() { applicationDocumentDao.allForOrg(1); // 添加断言验证业务逻辑 } } // 测试专用配置类 @Configuration @ComponentScan({"com.xxxx.persistence"}) // 确保扫到Jar包中的DAO所在路径 @EnableJpaRepositories("com.xxxx.persistence") // 若使用Spring Data JPA则添加此注解 @PropertySource("classpath:test-db.properties") // 加载测试数据库配置文件 public class PersistenceTestConfig { // 配置H2内存数据源,避免依赖生产数据库 @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"); dataSource.setUsername("sa"); dataSource.setPassword(""); return dataSource; } // 按需配置EntityManagerFactory、TransactionManager等必要Bean }
3. 额外检查要点
- 包扫描路径:确认
@ComponentScan的路径覆盖了ApplicationDocumentDao所在的包,比如如果DAO在com.xxxx.persistence,那扫描路径要明确包含这个包,或者直接指定具体包名。 - DAO类注解:Jar包中的DAO类必须标注
@Repository(或Spring Data JPA的@Repository/@Dao),这样Spring才能识别并创建Bean实例。 - 数据库配置:真实测试DAO需要连接数据库,建议用内存数据库(如H2),既不影响生产环境数据,又能验证DAO的真实逻辑。
内容的提问来源于stack exchange,提问作者mmaceachran
相关产品推荐
相关产品推荐

