我使用Flyway来管理我的Spring MVC应用程序中的数据库状态。
我在我的servlet上下文XML文件中完全按照their docs
中的建议配置它<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
<property name="dataSource" ref="..."/>
...
</bean>
<!-- The rest of the application (incl. Hibernate) -->
<!-- Must be run after Flyway to ensure the database is compatible with the code -->
<bean id="sessionFactory" class="..." depends-on="flyway">
...
</bean>
我想在JUnit测试中做两件事 -
在所有测试之前,删除并重新创建数据库并让它重新迁移。这为每个测试套件创建了一个干净的数据库。
在每次测试之前,清理所有数据库表。在其他框架(例如RSpec / Rails)中,我通过事务运行DB语句来完成此操作,因此它们在测试结束时回滚。不确定Spring MVC世界中的最佳实践是什么。
我不知道从哪里开始实施上述内容,所以我们非常感谢任何指导。
谢谢!
答案 0 :(得分:11)
首先,您可以在每次测试之前清理数据库,如下所示:
@Autowired
Flyway flyway;
@Before
public void init(){
flyway.clean();
flyway.migrate();
}
其次,您可以使用JdbcTestUtils删除表中的所有行。 您可以在此处找到文档: JDBC测试支持 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html
您还可以使用 @Rollback 和 @Commit 以交易方式运行测试方法。
@Rollback指示在测试方法完成后是否应回滚事务测试方法的事务。如果为true,则回滚事务;否则,交易已提交(另请参阅@Commit)。即使没有显式声明@Rollback,Spring TestContext Framework中集成测试的回滚语义也默认为true。
答案 1 :(得分:2)
我的团队使用SpringBoot。它内置了Flyway集成。后面的任何内容都不一定是SpringBoot依赖的,但使用SpringBoot确实可以使其中的一些更容易。
对于使用Flyway的集成测试,我们使用Spring Test以及内存H2数据库。我们使用Spring Profiles来定义“整合测试”。具有H2 JDBC配置的配置文件。 Spring Test个类为每个测试启动容器。因此,每个测试都会获得由Flyway创建的干净模式。因为它在H2的记忆中都没有清理。也不需要可能影响测试行为的交易诡计。
如果您真的想要在集成测试中使用Flyway进入床位,那么有一个Flyway / Spring Test annotation library。