类[org.jongo.bson.RelaxedLazyDBObject]的对象必须是类com.mongodb.BasicDBObject的实例

时间:2016-07-14 08:13:05

标签: spring mongodb testing

我正在尝试使用Spring Boot和Mongo Embedded(JHipster,Flapdoodle)设置测试。 一般来说它有效。我可以在Robomongo中看到创建的测试集合和对象(使用Mongobee迁移)。

但是当我想访问Clients集合时:     


    List clients = clientRepository.findAll();
    
它抛出:     

    java.lang.IllegalArgumentException: Given DBObject must be a BasicDBObject! Object of class [org.jongo.bson.RelaxedLazyDBObject] must be an instance of class com.mongodb.BasicDBObject
    

当我使用真正的Mongo实例运行应用程序时: ./mvnw -Pdev 即使测试和开发配置使用相同的Mongobee mibrations,也没有错误。

Spring文档非常简洁: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-mongo-embedded

我的测试配置文件application.yml是:     


    spring:
        mongodb:
            embedded:
                version: 3.2.1
        data:
            mongodb:
                host: localhost
                port: 27117
                database: mydb-test
    
我使用Mongo(实例)版本v3.2.7,在我设置的嵌入式Mongo的配置最高版本是3.2.1,也许这可能是个问题? 也许有人可以通过示例工作测试分享他的配置?

1 个答案:

答案 0 :(得分:1)

我发现自己的解决方案。

问题是我在@ChangeSet中使用 org.jongo.Jongo 而不是JHipster默认 com.mongodb.Db

由于某些原因,Jongo不能与Embedded Mongo一起使用。 当我切换到Db时,所有问题都已消失。

不工作:

@ChangeSet(...)
public void someChange(Jongo jongo) throws IOException {

    org.jongo.MongoCollection collection = jongo.getCollection("collection");
    DBObject basicDBObject = new BasicDBObject();
    collection.insert(basicDBObject);

     ...
}

WORKING:

@ChangeSet(...)
public void someChange(Db db) throws IOException {

    com.mongodb.MongoCollection collection = db.getCollection("collection");
    DBObject basicDBObject = new BasicDBObject();
    collection.insert(basicDBObject);
    ...
}