如何在Spring中的每次测试之前重新创建数据库?

我的Spring-Boot-Mvc-Web应用程序在application.properties文件中具有以下数据库配置:

 spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver 

这是我做的唯一配置。 我没有任何其他配置。 然而,Spring和子系统会在每个Web应用程序运行时自动重新创建数据库。 数据库在系统运行时重新创建,而在应用程序结束后包含数据。

我不理解这个默认值,并期望这适合测试。

但是当我开始运行测试时,我发现数据库只重建了一次。 由于测试是在没有预先定义的顺序下执行的,因此这是毫无意义的。

所以,问题是: 如何理解? 如何在应用程序首次启动时在每次测试之前重新创建数据库?

我的测试类标题如下:

 @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = myapp.class) //@WebAppConfiguration @WebIntegrationTest @DirtiesContext public class WebControllersTest { 

如您所见,我在课堂级别尝试了@DirtiesContext但没有帮助。

UPDATE

我有一个豆子

 @Service public class DatabaseService implements InitializingBean { 

哪个有方法

 @Override @Transactional() public void afterPropertiesSet() throws Exception { log.info("Bootstrapping data..."); User user = createRootUser(); if(populateDemo) { populateDemos(); } log.info("...Bootstrapping completed"); } 

现在我使用populateDemos()方法清除数据库中的所有数据。 不幸的是,尽管有@DirtiesContext ,它在每次测试之前都没有调用。 为什么?

实际上,我想你想要这个:

@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)

http://docs.spring.io/autorepo/docs/spring-framework/4.2.6.RELEASE/javadoc-api/org/springframework/test/annotation/DirtiesContext.html

@DirtiesContext可以用作同一类中的类级别和方法级别注释。 在这种情况下,ApplicationContext将在任何此类带注释的方法之后以及在整个类之后标记为脏。 如果DirtiesContext.ClassMode设置为AFTER_EACH_TEST_METHOD,则在类中的每个测试方法之后,上下文将被标记为脏。

要创建数据库,您必须使用spring.jpa.hibernate.ddl-auto=create-drop执行其他答案所说的内容,现在如果您的目的是在每个测试中对数据库进行化学处理,那么spring提供了非常有用的anotation

 @Transactional(value=JpaConfiguration.TRANSACTION_MANAGER_NAME) @Sql(executionPhase=ExecutionPhase.BEFORE_TEST_METHOD,scripts="classpath:/test-sql/group2.sql") public class GroupServiceTest extends TimeoffApplicationTests { 

来自这个包org.springframework.test.context.jdbc.Sql; 并且您可以运行before测试方法和after测试方法。 填充数据库。

关于每次创建数据库,假设您只希望Test具有create-drop选项,您可以使用带有此批注的自定义属性配置测试

 @TestPropertySource(locations="classpath:application-test.properties") public class TimeoffApplicationTests extends AbstractTransactionalJUnit4SpringContextTests{ 

希望能帮助到你

如果使用spring.jpa.hibernate.ddl-auto=create-drop应该足以创建/删除数据库?

使用spring boot,可以为每个测试唯一地定义h2数据库。 只需覆盖每个测试的数据源URL

  @SpringBootTest(properties = {"spring.config.name=myapp-test-h2","myapp.trx.datasource.url=jdbc:h2:mem:trxServiceStatus"}) 

测试可以并行运行。

在测试中,数据可以重置

 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) 

除非您使用某种Spring-Data集成(我根本不知道),这似乎是您需要自己实现的自定义逻辑。 Spring不了解您的数据库,其模式和表。

假设使用JUnit,请编写适当的@Before@After方法来设置和清理数据库,表和数据。 您的测试可以自己编写所需的数据,并在适当的情况下自行清理。