Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在Spring上每次测试后重置数据库,而不使用DirtiesContext_Database_Spring_Integration Testing - Fatal编程技术网

Database 在Spring上每次测试后重置数据库,而不使用DirtiesContext

Database 在Spring上每次测试后重置数据库,而不使用DirtiesContext,database,spring,integration-testing,Database,Spring,Integration Testing,我想知道是否有某种方法可以在每次集成测试后重置数据库,而不使用@DirtiesContext: @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 但是它非常慢,因为每次测试都会重新加载Spring上下文 我的测试使用的是MockMvc,对API执行rest调用。比如: mockMvc.perform(put("/products/) .header("Content-

我想知道是否有某种方法可以在每次集成测试后重置数据库,而不使用@DirtiesContext:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
但是它非常慢,因为每次测试都会重新加载Spring上下文

我的测试使用的是MockMvc,对API执行rest调用。比如:

mockMvc.perform(put("/products/)
            .header("Content-Type", "application/json")
            .content(jsonPost))
            .andExpect(status().isOk())
            .andReturn();

因此,在没有手动干预的情况下(创建和维护一个脚本来删除和创建表),Spring框架提供了一些替代方案?

在简单的情况下,将每个测试类注释为
@Transactional
,事务管理器将在每个
@test
方法之后执行回滚。获取更多信息。

我参加聚会有点晚,但我也遇到了同样的问题。我继承的应用程序中的所有单元测试(可以认为是集成测试)大约需要35分钟才能完成,使用嵌入式H2作为测试数据库。由@DirtiesContext注释的所有测试类,通常为方法级

因此,每个方法都会销毁并重新创建数据库。这需要时间。 通过删除dirties注释并在@Before方法中使用数据库截断类,我现在可以在大约4分钟内运行完整的测试套件。 如果您的Spring上下文中除了JPA之外还有任何东西(不由实体管理器处理)应该在测试之间删除,那么您必须显式地执行它

如果您愿意,我可以共享DB truncation类,但它只是使用JPA元模型来查找要截断的表。截断在H2中似乎非常有效。可以配置基于视图而非表的实体的例外情况


为了简化截断,请在截断之前关闭引用完整性,并在完成后将其重新打开。

您可以通过执行以下操作清理所需的表:

  • 注入JdbcTemplate实例
  • @Autowired
    私有JdbcTemplate JdbcTemplate;
    
  • 使用类JdbcTestUtils从需要删除的表中删除记录
  • JdbcTestUtils.deleteFromTables(jdbcTemplate,“table1”、“table2”、“table3”);
    
  • 在测试类中,在每个之后或之后使用
    @注释的方法中调用此行:
  • 每次之后 void tearDown()引发DatabaseException{ deleteFromTables(jdbcTemplate,“表1”、“表2”、“表3”); } 我在这篇博文中发现了这种方法:

    谢谢!抱歉,但我没有提到我的测试是使用MockMVC,进行rest调用。我认为这在这种情况下是行不通的。问题是关于
    没有人工干预的情况下