You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot使用H2内存数据库编写测试遇问题求助

解决基于H2内存数据库的Spring Boot测试报错问题

你遇到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:51:44