Mockito - 对由 mock 对象方法返回的对象的方法进行存根

2022-09-04 20:58:00

假设我有一个模拟对象,我不想存根它的任何方法,但我想存根它返回的对象的方法。例如

when(mockObject.method1()).thenReturn(returnValue)

是通常的做法,但我正在寻找,

when(mockObject.method1().method2()).thenReturn(returnValue)

这可能吗?如果我这样做,我会得到一个NullPointerException。目前,我有存根第一个方法返回一个模拟对象,然后使用返回的模拟对象,存根第二个方法。但是,这些临时模拟对象对我来说是无用的,并且在将许多方法链接在一起之后,这会导致许多无用的模拟对象。

编辑:实际上,链接可能有效,但我的对象导致了NPE。此代码(第一行)导致 NPE:

when(graphDb.index().getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);

但此代码有效:

IndexManager indexManager = mock(IndexManager.class);
when(graphDb.index()).thenReturn(indexManager);
when(indexManager.getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);

因此,链接不适用于getNodeAutoIndexer(),它返回一个AutoIndexer对象,而对于getRelationshipAutoIndexer()则返回一个关系自动索引器。两个返回值都模拟如下:

nodeAutoIndexer = (AutoIndexer<Node>) mock(AutoIndexer.class);
relAutoIndexer = mock(RelationshipAutoIndexer.class);

那么是什么导致了这个问题呢?


答案 1

完全没有问题。

让我们检查一下这 4 行代码:

IndexManager indexManager = mock(IndexManager.class);
when(graphDb.index()).thenReturn(indexManager);
when(indexManager.getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);

第一行创建一个模拟索引管理器。

第二个告诉 mock graphDb 在调用 index 方法时返回 indexManager(在第一行创建的 mock)。

第三个告诉模拟 indexManager(在第一行创建)在调用其 getNodeAutoIndexer 方法时返回 nodeAutoIndexer。

最后一行调用 graphDb.index(),它返回 mock indexManager(你告诉它在第二行执行此操作),并要求这个 indexManager(这是你在第一行创建的模拟)在调用其 getRelationshipAutoIndexer 方法时返回 relAutoIndexer。

最后一行之所以有效,只是因为您告诉模拟 graphDb 在调用其索引方法时要返回什么。如果您以前没有这样做,则 mock graphDb.index() 方法将返回 null,并且您将有一个 NPE。


答案 2

推荐