Database 在Spring上每次测试后重置数据库,而不使用DirtiesContext
我想知道是否有某种方法可以在每次集成测试后重置数据库,而不使用@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(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中似乎非常有效。可以配置基于视图而非表的实体的例外情况
为了简化截断,请在截断之前关闭引用完整性,并在完成后将其重新打开。您可以通过执行以下操作清理所需的表:
@Autowired
私有JdbcTemplate JdbcTemplate;
JdbcTestUtils.deleteFromTables(jdbcTemplate,“table1”、“table2”、“table3”);
@注释的方法中调用此行:
谢谢!抱歉,但我没有提到我的测试是使用MockMVC,进行rest调用。我认为这在这种情况下是行不通的。问题是关于
没有人工干预的情况下