13

モックオブジェクトがあり、そのメソッドをスタブしたくないが、返されるオブジェクトのメソッドをスタブしたいとします。例えば、

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

それが通常行われている方法ですが、私は探しています、

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

それは可能ですか?そうすると、NullPointerExceptionが発生します。現在、モックオブジェクトを返す最初のメソッドをスタブし、次に返されたモックオブジェクトを使用して、2番目のメソッドをスタブします。ただし、これらの一時的なモックオブジェクトは私には役に立たず、多くのメソッドをチェーン化した後、多くの役に立たないモックオブジェクトが生成されます。

編集:実際には、チェーンが機能する可能性がありますが、私のオブジェクトが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);

したがって、チェーンは、AutoIndexerオブジェクトを返すgetNodeAutoIndexer()では機能しませんでしたが、RelationshipAutoIndexerを返すgetRelationshipAutoIndexer()では機能しませんでした。両方の戻り値は次のようにモックされます。

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

では、何が問題を引き起こしているのでしょうか?

4

1 に答える 1

15

全く問題ありません。

次の 4 行のコードを調べてみましょう。

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

最初の行は、モックの indexManager を作成します。

2 つ目は、index メソッドが呼び出されたときに indexManager (最初の行で作成されたモック) を返すようにモック graphDb に指示します。

3 番目のものは、 getNodeAutoIndexer メソッドが呼び出されたときに nodeAutoIndexer を返すようにモック indexManager (最初の行で作成) に指示します。

そして最後の行は、モック indexManager を返す graphDb.index() を呼び出し (2 行目でそれを行うように指示しました)、この indexManager (最初の行で作成したモック) に、getRelationshipAutoIndexer メソッドが実行されたときに relAutoIndexer を返すように要求します。と呼ばれます。

最後の行が機能するのは、インデックス メソッドが呼び出されたときに何を返すかをモック graphDb に指示したからです。以前にこれを行っていなければ、モックの graphDb.index() メソッドが null を返し、NPE が発生していたでしょう。

于 2011-10-29T07:17:03.317 に答える