Spring 用于集成测试的EmbedMongo
在测试用Spring+RESt+Mongo2.4编写的应用程序时,我正在寻找事务支持来回滚更改。但这是不可能的,因为我们不能为mongodb使用事务。在搜索集成测试时,我发现很少有关于embedMongo进行集成测试的链接。您还可以通过在某处运行专用的mongo db实例来进行集成测试。Embedded mongo提供了什么特殊功能?我没有找到很好的文档,它是否在Apache许可下 在测试用Spring+RESt+Mongo2.4编写的应用程序时,我正在寻找事务支持来回滚更改。但这是不可能的,因为我们不能为mongodb使用事务 不支持事务,但您确实可以使用一些替代方法在测试时回滚更改:Spring 用于集成测试的EmbedMongo,spring,mongodb,integration-testing,Spring,Mongodb,Integration Testing,在测试用Spring+RESt+Mongo2.4编写的应用程序时,我正在寻找事务支持来回滚更改。但这是不可能的,因为我们不能为mongodb使用事务。在搜索集成测试时,我发现很少有关于embedMongo进行集成测试的链接。您还可以通过在某处运行专用的mongo db实例来进行集成测试。Embedded mongo提供了什么特殊功能?我没有找到很好的文档,它是否在Apache许可下 在测试用Spring+RESt+Mongo2.4编写的应用程序时,我正在寻找事务支持来回滚更改。但这是不可能的,因
- 在单元测试的设置或拆卸过程中,根据需要创建/重置数据
- 为初始数据集设定种子,并在测试期间使用
启动--syncdelay=0
,这样就不会将新数据写入磁盘(嵌入式MongoDB建议将此作为一种方法)mongod
MongoDB服务器二进制文件将使用,即AGPL v3.0。我使用了以下机制来模拟
@Transactional
测试
创建了一个简单的类,该类通过
- 在测试之前保存数据库状态的快照
- 测试后恢复它
@Service
public class MongoTestHelper {
@Autowired
private MongoTemplate mongoTemplate;
private Map<String, List<Document>> snapshot = null;
public void createSnapshot() {
this.snapshot = new HashMap<>();
mongoTemplate.getCollectionNames().forEach(collectionName ->
{
List<Document> collectionDocs = new ArrayList<>();
mongoTemplate.getCollection(collectionName).find(Document.class)
.forEach((Consumer<? super Document>) collectionDocs::add);
snapshot.put(collectionName, collectionDocs);
}
);
}
public void restoreSnapshot() {
snapshot.keySet().forEach(collectionName -> {
mongoTemplate.dropCollection(collectionName);
snapshot.get(collectionName).forEach(d ->
mongoTemplate.insert(d, collectionName)
);
});
}
public boolean hasSnapshot() {
return this.snapshot != null;
}
}
另外,您可以扩展以下方法来保存/恢复索引和其他与数据库相关的内容。在集成测试中,您只需要使用
@DirtiesContext
此示例将在每个测试方法之后重置MongoDB数据库:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class OrderControllerIT {
此注释也可与
@DataMongoTest
一起使用。这在使用时非常有效。嵌入式Mongo db是否支持Mongo db 2.4版本?我还发现NoSQL Unit是单元测试工具之一。你知道这是否适用于Embedded Mongo吗?@Milind:如前所述,Embedded MongoDB只是标准二进制文件的包装,因此应该可以轻松地适用于任何版本的MongoDB。看看Github,它在2.5.4开发版本中一直在更新。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class OrderControllerIT {