Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 用于集成测试的EmbedMongo_Spring_Mongodb_Integration Testing - Fatal编程技术网

Spring 用于集成测试的EmbedMongo

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编写的应用程序时,我正在寻找事务支持来回滚更改。但这是不可能的,因

在测试用Spring+RESt+Mongo2.4编写的应用程序时,我正在寻找事务支持来回滚更改。但这是不可能的,因为我们不能为mongodb使用事务。在搜索集成测试时,我发现很少有关于embedMongo进行集成测试的链接。您还可以通过在某处运行专用的mongo db实例来进行集成测试。Embedded mongo提供了什么特殊功能?我没有找到很好的文档,它是否在Apache许可下

在测试用Spring+RESt+Mongo2.4编写的应用程序时,我正在寻找事务支持来回滚更改。但这是不可能的,因为我们不能为mongodb使用事务

不支持事务,但您确实可以使用一些替代方法在测试时回滚更改:

  • 在单元测试的设置或拆卸过程中,根据需要创建/重置数据
  • 为初始数据集设定种子,并在测试期间使用
    --syncdelay=0
    启动
    mongod
    ,这样就不会将新数据写入磁盘(嵌入式MongoDB建议将此作为一种方法)
在搜索集成测试时,我发现很少有关于embedMongo进行集成测试的链接。您还可以通过在某处运行专用的mongo db实例来进行集成测试。Embedded mongo提供了什么特殊功能

是标准MongoDB服务器二进制文件的包装器,旨在帮助进行单元测试。包装器的“特殊功能”只是通过单元测试启动/停止MongoDB实例的函数

另请参见以下评论:

我没有找到很好的文档,它是否在Apache许可下

GitHub上的源文件建议使用Apache 2.0许可证


MongoDB服务器二进制文件将使用,即AGPL v3.0。

我使用了以下机制来模拟
@Transactional
测试

创建了一个简单的类,该类通过

  • 在测试之前保存数据库状态的快照
  • 测试后恢复它
或者,如果所有测试都以相同的DB状态开始,则第一次保存快照,并在每次其他测试之前恢复快照

样本测试助手

@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 {