使用测试配置运行单元测试时未创建表问题求助
听起来你遇到了挺头疼的问题——没碰配置但单元测试里的数据库表突然不自动建了。Spring的自动配置有时候确实会有一些隐性的变化,我给你列几个常见的排查点:
测试类注解的隐性变更:
哪怕你没改配置文件,测试类上的注解如果被误改(比如不小心删掉了@SpringBootTest,或者换成了@DataJpaTest但没配套配置),都会影响表创建逻辑。比如@DataJpaTest默认是不会自动建表的,得加上@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE),或者专门配置DDL属性才行。依赖版本的悄悄更新:
如果你最近升级了Spring Boot、Spring Data JPA或者数据库驱动,新版本可能调整了默认配置。比如有些Spring Boot版本里,测试环境下spring.jpa.hibernate.ddl-auto的默认值从create-drop改成了none,直接导致表不创建。配置文件的优先级覆盖:
说不定有其他优先级更高的配置覆盖了application-test.properties的设置。比如项目里有application-test.yml(YAML格式比properties优先级高),或者测试类用@TestPropertySource指定了其他配置文件,里面把spring.jpa.hibernate.ddl-auto设成了none或者validate。数据库连接的潜在问题:
虽然表创建是ORM层的事,但如果测试数据库连不上(比如URL、账号密码错了,数据库服务没启动),Hibernate会跳过DDL执行。你可以去测试日志里找找有没有数据库连接失败的报错。Hibernate的隐性配置覆盖:
除了spring.jpa.hibernate.ddl-auto,还有spring.jpa.properties.hibernate.hbm2ddl.auto这个属性(优先级更高),如果它被悄悄设成none,也会让表创建失效。另外,如果开了spring.jpa.generate-ddl=false,同样会禁用自动建表。测试Profile没正确激活:
要是测试类没加@ActiveProfiles("test"),可能加载的是默认的application.properties而不是application-test.properties,而默认配置里的DDL属性是关闭的。
要是能把application-test.properties里的具体配置贴出来,再加上测试类的注解信息,我能帮你更精准地定位问题。
内容的提问来源于stack exchange,提问作者Stefan Falk

