Spring H2 Test DB在每次测试之前不会重置

时间:2018-06-26 06:29:54

标签: spring-boot junit h2

编辑:正如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秒的启动时间。

还有其他解决方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

Spring Test Framework