Java 如何模拟Couchbase Lite数据库
我已经创建了一个服务层,它使用DAO获取Couchbase文档对象并将它们交给POJO。我想为这个方法编写一个单元测试Java 如何模拟Couchbase Lite数据库,java,mockito,couchbase,powermock,couchbase-lite,Java,Mockito,Couchbase,Powermock,Couchbase Lite,我已经创建了一个服务层,它使用DAO获取Couchbase文档对象并将它们交给POJO。我想为这个方法编写一个单元测试 public List<Survey> findAll() throws CouchbaseLiteException { List<Document> docList = listsDAO.findAll(); List<Survey> surveyList = new ArrayList<>(); f
public List<Survey> findAll() throws CouchbaseLiteException {
List<Document> docList = listsDAO.findAll();
List<Survey> surveyList = new ArrayList<>();
for(Document doc: docList) {
ListClass listClass = listClassService.findById((String)doc.getProperty("listClass"));
Survey survey = new Survey.Builder().withName((String)doc.getProperty("name"))
.withListClass(listClass.getName()).build();
surveyList.add(survey);
}
return surveyList;
}
但是我在使用TestUtils.createDocuments()方法时遇到了问题
private static Document createDocument(Database database, Map<String, Object> docMap) {
Document doc = database.createDocument();
try {
doc.putProperties(docMap);
} catch (CouchbaseLiteException e) {
e.printStackTrace();
}
return doc;
}
public static List<Document> createDocuments(Database database) {
List<Document> docList = new ArrayList<>();
docList.add(createDocument(database, DOC_MAP1));
docList.add(createDocument(database, DOC_MAP2));
return docList;
}
我做错了什么?TestUtils.createDocuments
尝试运行方法database.createDocument()
,而在您的情况下,database
是模拟对象,createDocument
不是模拟对象
我建议不要模拟数据库,手动创建一个文档列表(不要调用database.createDocument()
)
如何创建一组文档模拟,并测试是否返回相同的模拟?例如:
Document doc1 = PowerMockito.mock(Document.class);
Document doc2 = PowerMockito.mock(Document.class);
when(listsDAO.findAll()).thenReturn(new Document[] {doc1, doc2});
...
尝试为数据库对象添加when语句,并返回文档的模拟,并在完成后验证对该文档的方法调用
//添加到@Before方法或测试方法中
mockDocument=PowerMockito.mock(Document.class);
当(database.createdocument())。然后返回(mockDocument);
之后,您可以验证是否已将正确的参数传递给您的模拟
Mockito.verify(mockDocument).putProperties(docMap);
希望能有所帮助。我刚刚尝试过这个方法。实际上,文档对象的构造函数是Document(数据库,字符串documentId)
所以它仍然需要一个数据库对象。我明白你的意思,但是for循环依赖于文档对象中设置的属性?我相信没有其他方法。只需模拟文档对象中依赖的所有字段。基本上,文档是Couchbase API的一部分,所以您要么实例化它,要么模拟它。实例化需要数据库,这在测试中是无法做到的。因此,剩下的唯一选择是完全模拟文档。另外,在我的代码中,我尝试通过从不将类从基础结构级别(在您的示例中是文档类)返回到应用程序的其他层来避免此类问题。也就是说,我会设计listsDAO来转换Document->MyAppDocument并返回它。通过这种方式,您可以以任何您喜欢的方式实例化MyAppDocument。好吧,我明白了,这实际上是一个DTO?我看不到对数据库.createDocument()
方法调用的模拟,这可能是个问题,特别是如果它是静态的。
Document doc1 = PowerMockito.mock(Document.class);
Document doc2 = PowerMockito.mock(Document.class);
when(listsDAO.findAll()).thenReturn(new Document[] {doc1, doc2});
...
Mockito.verify(mockDocument).putProperties(docMap);