1

我正在为 Spring-Data JPA 和 Spring-Data-Mongo 存储库创建 JUnit 测试(每个类仅包含一个存储库的测试)。为了在执行每个测试之前清理数据库,我使用 DirtiesContext:

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)

对于 JPA(Postgres 或 H2 DB),它可以正常工作,因此对于每个测试,我都会得到一个干净的数据库。但它不适用于 MongoDB - 每次测试之前都不会重新创建数据库。我知道我可以使用:

    @Autowired
    private MongoTemplate mongoTemplate;

    @After
    public void clearCollection() {
        mongoTemplate.dropCollection(DocHeader.class);
    }

但我想了解为什么它适用于 Postgres 或 H2 而不适用于 Mongo。

4

1 回答 1

1

默认情况下,Spring 测试基础架构会在使用相同配置时重用为测试创建的应用程序上下文。

@DirtiesContext将应用程序上下文标记为脏,即以某种方式被测试更改(或者在您的情况下是以前的测试),因此创建了一个新的应用程序上下文。

这将包括为数据库创建一个新DataSource的。

使用 H2 内存数据库,创建一个新的DataSource(之前删除旧的)实际上会删除数据库并创建一个新的。此行为可以通过 JDBC-URL 参数进行配置。有关详细信息,请参阅http://www.h2database.com/html/features.html#embedded_databases

使用普通数据库删除和重新创建Connections/ DataSources 对数据库没有任何作用,您的数据和架构将保持不变。

于 2017-03-27T05:00:48.513 回答