首页 > 解决方案 > JUnit:模拟 DBCursor 不能正常工作

问题描述

我有一些模拟 JacksonDBCollection 的问题,如果我尝试测试我的方法(参见下面的代码),那么我会遇到这些异常:

java.lang.NullPointerException
    at org.mongojack.DBCursor.<init>(DBCursor.java:85)
    at org.mongojack.JacksonDBCollection.find(JacksonDBCollection.java:1156)

.....

问题是这一行:DBCursor<MyObject> cursor = mongojackCol.find(searchQuery);因为 dbCursor 为空。我怎样才能模拟 mongojackCol,以返回模拟的dbCursor(见这一行:) dbCursor = (DBCursor<MyObject>)mock(DBCursor.class)?谢谢

public MyObject getMyObjectById(String id) {


JacksonDBCollection<MyObject, String> mongojackCol =
JacksonDBCollection.wrap(collection, MyObject.class, String.class);
MyObject myObject = null;
try {

ObjectId objectId = new ObjectId(id);

BasicDBObject searchQuery = new BasicDBObject();
searchQuery.put(MyObject.MONGO_ID, objectId);

DBCursor<MyObject> cursor = mongojackCol.find(searchQuery);

if (cursor.hasNext()) {
myObject = cursor.next();
}

} catch (IllegalArgumentException e) {
return myObject; 
}

return myObject;
}

@Test
public void getMyObjectByIdTest() {
 db = mock(DB.class);
 dbCollection = mock(DBCollection.class);

 dbCursor = (DBCursor<MyObject>)mock(DBCursor.class);

 jacksonDBCollection = (JacksonDBCollection<MyObject, String>)mock(JacksonDBCollection.class);

 MyObject myObject = new MyObject(x, y);

 when(dbCursor.size()).thenReturn(1);        
 when(dbCursor.next()).thenReturn(myObject);
 when(jacksonDBCollection.find(any(BasicDBObject.class))).thenReturn(dbCursor);

 MyObject dr = mongoStoreDAO.getMyObjectById("abababababababababababab");   
 assertThat(dr).isEqualTo(myObject);  
}

标签: javamongodbjunitmocking

解决方案


推荐阅读