当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Spring中的每次测试之前重新创建数据库?》经验,为你挑选了4个好方法。

我的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.为什么?



1> Raphael Amoe..:

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

@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,则在类中的每个测试方法之后,上下文将被标记为脏.


它不会产生重复的键冲突,因为它会重新创建数据库,而不仅仅是删除表中的所有值。它将删除数据库。因此,每个测试都将在一个全新的数据库上运行。这样,测试不会影响另一个测试。
@lapots我只是在调查类似的问题并找到了解决方案,但是不能说为什么它对我确实有效。我的设置是:Spring-boot5,junit5,内存H2,类级别的DirtiesContext。我发现的是,当H2 url被命名为'jdbc:h2:mem:mem1'(此处的mem1很重要)时,则测试失败(mvn测试)。但是使H2 url像'jdbc:h2:mem'一样可以解决它!

2> jstuartmilne..:

要创建数据库,您必须执行其他答案所说的内容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测试方法.填充数据库.

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

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

希望能帮助到你



3> Interlated..:

使用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)



4> 小智..:

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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有