gpt4 book ai didi

spring-boot - Spring H2 测试数据库在每次测试前不会重置

转载 作者:行者123 更新时间:2023-12-03 16:14:28 25 4
gpt4 key购买 nike

编辑:正如 C. Weber 在评论中所建议的,解决方案是添加 @Transactional到测试类。

我有一些使用 H2 内存数据库的测试。我需要在每次测试之前重置数据库。尽管每次执行测试时都会运行我的 SQL 脚本,但未正确重置数据库,导致删除测试后缺少所需的条目。

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureTestDatabase(replace=Replace.ANY, connection=EmbeddedDatabaseConnection.H2)
public class RepositoryTests {

@Autowired
private Repository repository;

@Autowired
private DataSource dataSource;

@Before
public void populateDb() {
Resource initSchema = new ClassPathResource("database/schema.sql");
Resource initData = new ClassPathResource("database/data.sql");
DatabasePopulator dbPopulator = new ResourceDatabasePopulator(initSchema, initData);
DatabasePopulatorUtils.execute(dbPopulator, dataSource);
}

@Test
public void testMethod1() {
// ...
repository.delete("testdata");
}

@Test
public void testMethod2() {
// ...
Object test = repository.get("testdata");
// is null but should be an instance
}
}

schema.sql 在重新创建它们之前删除所有表。 data.sql 将所有需要的测试数据插入到数据库中。

运行 testMethod2只有成功。但是,运行所有测试会使测试失败并返回 NullPointerException .

我已经成功尝试使用 @DirtiesContext ,但是这不是一个选项,因为我无法承受每 0.1 秒测试的 20 秒启动时间。

还有其他解决方案吗?

最佳答案

Spring 测试框架为您想要的测试行为提供了一种机制。只需使用 @Transactional 注释您的 Test 类即可获得每个测试方法的默认回滚行为。

有一些方法可以配置测试的事务行为,也有一些陷阱(例如在测试方法中使用 RestTemplate),您可以在 Spring 手册的相应章节中阅读更多相关信息。

Spring Test Framework

关于spring-boot - Spring H2 测试数据库在每次测试前不会重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51036215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com