Spring Boot 3.1.4服务测试无法找到数据库表问题
Spring Boot 3.1.4 集成测试异常:找不到
test.role表 问题背景
我正在开发Spring Boot 3.1.4应用,相同代码在Spring Boot 3.0.5中可正常运行,但升级后Service层集成测试出现异常。
核心代码展示
主应用类
@SpringBootApplication public class JobSearchApplication { public static void main(String[] args) { SpringApplication.run(JobSearchApplication.class, args); } }
数据库配置类
package com.tomholmes.product.jobsearch.config; @Configuration @EnableAutoConfiguration @ComponentScan("com.tomholmes.product.jobsearch") @EntityScan("com.tomholmes.product.jobsearch.model") @EnableJpaRepositories(basePackages = "com.tomholmes.product.jobsearch.repository") @EnableTransactionManagement public class DatabaseConfiguration { }
Repository层测试(正常运行)
@AutoConfigureTestDatabase(replace=Replace.NONE) @DataJpaTest public class RoleRepositoryTest { @Autowired private RoleRepository repository; @Test public void testFindById() { long id = 1; RoleEntity roleEntity = repository.findById(id).orElse(null); assertNotNull(roleEntity); assertEquals(id, roleEntity.getId()); } }
Service层实现
@Transactional @Service("roleService") public class RoleServiceImpl implements RoleService { private RoleRepository roleRepository; public RoleServiceImpl(RoleRepository roleRepository) { this.roleRepository = roleRepository; } @Override public RoleEntity getById(long id) { RoleEntity role = roleRepository.findById(id).orElse(null); return role; } }
异常的Service集成测试
@SpringBootTest(classes = JobSearchApplication.class) @Transactional public class RoleServiceTest { @Autowired private RoleService service; @Test public void testGetById() { long id = 1; RoleEntity entity = service.getById(id); assertNotNull(entity); assertEquals(id, entity.getId()); } }
报错信息
Caused by: java.sql.SQLSyntaxErrorException: Table 'test.role' doesn't exist at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) ~[mysql-connector-j-8.0.33.jar:8.0.33] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.33.jar:8.0.33] at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916) ~[mysql-connector-j-8.0.33.jar:8.0.33] at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:972) ~[mysql-connector-j-8.0.33.jar:8.0.33] at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-5.0.1.jar:na] at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-5.0.1.jar:na] at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:239) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final] ... 156 common frames omitted
配置文件(更新)
# Spring Boot - Hibernate6 settings spring.datasource.url=jdbc:mysql://localhost:3306/job_search_db?serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=username spring.datasource.password=password spring.jpa.show-sql=true spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
问题说明
- Repository测试可正常连接
job_search_db库并查询role表 - Service集成测试却试图访问
test.role表,而非指定的job_search_db.role - 已尝试修改
@SpringBootTest的classes参数为DatabaseConfiguration.class,无效 - 使用最新MySQL驱动,希望用真实数据库测试业务逻辑
内容的提问来源于stack exchange,提问作者tjholmes66
相关产品推荐
相关产品推荐

