Spring Boot使用H2内存数据库编写测试遇问题求助
你遇到的IllegalStateException: Unable to retrieve @EnableAutoConfiguration base packages错误,主要是测试类注解配置不当、自定义数据库配置干扰自动配置,以及Repository泛型不匹配这几个核心原因导致的。下面一步步帮你排查解决:
1. 修复测试类的注解逻辑
@DataJpaTest本身已经封装了Spring Boot测试的核心配置,额外添加@SpringBootConfiguration反而会打乱自动包扫描的逻辑。同时要确保测试能正确扫描到实体类和Repository,调整后的测试类如下:
@RunWith(SpringRunner.class) @DataJpaTest @EntityScan(basePackages = "your.package.path") // 替换成你的实体类实际所在包 @EnableJpaRepositories(basePackages = "your.package.path") // 替换成你的Repository实际所在包 public class NamesTest { @Autowired private NamesRepository namesRepository; @Test public void firstTest() { // 示例测试逻辑 Names testName = new Names(); testName.setName("TestUser"); namesRepository.save(testName); Names retrievedName = namesRepository.findByName("TestUser"); assertNotNull(retrievedName); assertEquals("TestUser", retrievedName.getName()); } }
2. 修正Repository的泛型类型
你的Names实体ID是int基本类型,但JpaRepository的泛型参数要求使用包装类Integer(保持类型匹配),否则会引发ORM映射异常。修改后的Repository代码:
@Repository("namesRepository") public interface NamesRepository extends JpaRepository<Names, Integer> { Names findByName(String name); List<Names> findAll(); }
3. 配置测试专用的H2内存数据库
在src/test/resources下创建application-test.yml,专门用于测试环境的数据库配置,覆盖主配置的PostgreSQL设置:
spring: profiles: test datasource: driverClassName: org.h2.Driver url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: jpa: database-platform: org.hibernate.dialect.H2Dialect hibernate: ddl-auto: create-drop show-sql: true
然后在测试类上激活test环境:
@RunWith(SpringRunner.class) @DataJpaTest @ActiveProfiles("test") // 启用测试专用配置 @EntityScan(basePackages = "your.package.path") @EnableJpaRepositories(basePackages = "your.package.path") public class NamesTest { // ... 测试代码 }
4. 调整自定义DatabaseConfig,避免干扰测试
你的DatabaseConfig是为生产环境PostgreSQL设计的,测试时需要让它失效。给它添加@Profile注解,仅在非测试环境激活:
@Configuration @Profile("!test") // 只有非test环境才生效 public class DatabaseConfig { @Bean @ConfigurationProperties(prefix="spring.dbProfileService") @Primary public DataSource createProfileServiceDataSource() { return DataSourceBuilder.create().build(); } @Bean @Autowired public JdbcTemplate createJdbcTemplate_ProfileService(DataSource profileServiceDS) { return new JdbcTemplate(profileServiceDS); } }
5. 统一Spring Boot依赖版本,避免兼容性冲突
你的Gradle依赖中Spring Boot版本不统一(2.0.0.RELEASE、2.0.1.RELEASE、2.0.2.RELEASE),这很容易引发依赖冲突。建议用Spring Boot的依赖管理插件统一版本:
plugins { id 'org.springframework.boot' version '2.0.2.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' dependencies { compile('org.springframework.boot:spring-boot-starter-jdbc') compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-data-cassandra') compile('org.springframework.boot:spring-boot-starter-security') compile('org.postgresql:postgresql') // 建议使用Spring Boot管理的hibernate-validator版本,避免手动指定的兼容性问题 compile('org.hibernate:hibernate-validator') testCompile('org.springframework.boot:spring-boot-starter-test') testCompile('com.h2database:h2') }
完成以上调整后,你的H2内存数据库测试应该就能正常运行了。
内容的提问来源于stack exchange,提问作者P.Zaw

