我在模拟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);
}