我正在使用JUnit来测试我的应用程序,只要数据库在测试之前已经初始化(使用gradle bootRun
作为web-app运行),一切正常。但是,如果数据库为空,则应用程序似乎在测试之前不会初始化任何模型或实体。有没有办法我应该这样做?我假设ApplicationRunner
类将在测试之前运行并使实体初始化。有没有办法做到这一点,还是我使用了错误的方法?
这就是我的application.properties
文件的样子:
server.port=8090
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=123456
server.ssl.key-password 123456
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.naming-strategy:org.hibernate.cfg.ImprovedNamingStrategy
application.logger.org.springframework=INFO
我的数据库使用/src/main/java/application/persistence/DbConfig.java
连接存储在DriverManagerDataSource
中。我已经设置ApplicationRunner
以便在启动时向数据库添加几行。
编辑:
我还应该补充一点,这些是我在JUnit测试文件中使用的注释:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes={
AdeyTrackApplication.class,
SecurityConfig.class,
WebConfig.class,
AuthorizationController.class
})
答案 0 :(得分:25)
如果您不想从@Before
JUnit钩子显式执行该选项,可以使用各种选项。
schema.sql
或data.sql
放入src/test/resources
文件夹,以便仅在测试期间将其选中。答案 1 :(得分:2)
以上答案都使用.sql架构加载技术,我必须有一个.sql架构进行测试。我不希望这样做,因为我的架构正在扩展,而且当我的测试扩展时,我宁愿不经历向架构添加条目的麻烦。
当我使用Spring Boot时,我遇到了这个注释,它似乎通过首先运行bootRun
然后运行测试来解决问题。
在我的测试注释中,我将@ContextConfigurations
替换为@SpringApplicationConfiguration
,并将所有类保持为相同。这似乎解决了这个问题。所以现在test
任务调用bootRun加载类,然后运行测试。
请参阅@SpringApplicationConfiguration
跳跃这可以帮助任何人面对同样的问题。
答案 2 :(得分:1)
例如,您可以使用@Sql注释来填充数据库^
@Sql(scripts = "classpath:db/populateDB.sql")