【问题标题】:Spring H2 Test DB does not reset before each testSpring H2 Test DB 在每次测试之前不会重置
【发布时间】:2018-12-04 18:45:04
【问题描述】:

编辑:正如 C. Weber 在 cmets 中建议的那样,解决方案是将 @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 秒的启动时间。

还有其他解决方案吗?

【问题讨论】:

  • 你试过在你的测试类中使用@Transactional吗?
  • 哇,成功了!太感谢了。您应该将此作为解决方案发布:)
  • 完成。我很高兴能为您提供帮助。

标签: spring-boot junit h2


【解决方案1】:

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

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

Spring Test Framework

【讨论】:

  • @Transacitonal 注释根本没有帮助我。我将两者放在类级别上,并分别放在方法上,但在脉络中。在我第二次运行测试后,第一次运行测试已经更改了数据库。可能是什么问题?
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2011-12-31
  • 2019-12-28
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多