编辑:正如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秒的启动时间。
还有其他解决方法吗?
答案 0 :(得分:1)
Spring Test Framework为您想要的测试行为提供了一种机制。只需使用@Transactional注释您的Test类即可获取每个测试方法的默认回滚行为。
有多种方法可以配置测试的事务行为,以及一些陷阱(例如在测试方法内部使用RestTemplate),您可以在Spring手册的相应章节中了解更多信息。