Java 如何模拟Couchbase Lite数据库

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

我已经创建了一个服务层,它使用DAO获取Couchbase文档对象并将它们交给POJO。我想为这个方法编写一个单元测试

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);