0

指定されたコードを使用して、選択したものをアサートするよりも、イベントタイプでイベントを選択するよりもmongo dbに接続しようとします

@Grab('org.mongodb:mongodb-driver:3.4.1')

import com.mongodb.MongoClient
import com.mongodb.MongoClientURI
import com.mongodb.DBCollection
import com.mongodb.DB
import com.mongodb.DBCursor;
import com.mongodb.BasicDBObject
import com.mongodb.DBObject;
import groovy.json.JsonSlurper;

class MongoService {
    private MongoClient mongoClient

    def login = "user"
    def password = "pass"
    def host = "host"
    def port = port
    def databaseName = 'mongodb'

    public MongoClient client() {
        mongoClient = new MongoClient(new MongoClientURI(
               new StringBuilder("mongodb://").
               append(login).append(":").
               append(password).append("@").
               append(host).append(":").
               append(port).append("/").
               append(databaseName).toString()))
                              ;

        return mongoClient
    }

    public DBCollection collection(collectionName) {
        DB db = client().getDB(databaseName)

        return db.getCollection(collectionName)
    }
}

def service = new MongoService(databaseName: 'mongodb') 
def foo = service.collection('events')

BasicDBObject whereQuery = new BasicDBObject();
    whereQuery.put("EventType", "test");

    DBCursor cursor = foo.find(whereQuery);
    while (cursor.hasNext()) {
        log.info(cursor.next())

    }
    def json = cursor.next()

    def slurper = new groovy.json.JsonSlurper()
     def result = slurper.parseText(json)
      assert result.EventType == "test"

52 行目で soapui が java.util.NoSuchElementException エラーを返します。同じクエリを使用して mongodb で手動チェックを行うと、db.getCollection('events').find({"EventType": "test"}) 1 つのオブジェクトが返されます。私はそれを機能させる方法がわかりません... :/

4

1 に答える 1

0

問題は、カーソルへのアクセス方法です。

呼び出したときに既にカーソルが使い果たされており、そのlog.info(cursor.next())ときcursor.next()にアクセスする要素がなく、その例外の理由です。

DBCursor cursor = foo.find(whereQuery);
while (cursor.hasNext()) {
    log.info(cursor.next())
}
def json = cursor.next()

そのため、コードを変更cursor.next()して、while ループの反復ごとに 1 つ呼び出すようにします。

于 2017-01-10T17:34:33.647 に答える