モックオブジェクトがあり、そのメソッドをスタブ化したくないが、返されるオブジェクトのメソッドをスタブ化したいとしましょう。例えば、
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);
そのため、RelationshipAutoIndexerを返すgetRelationshipAutoIndexer()に対して機能する一方で、AutoIndexerオブジェクトを返すgetNodeAutoIndexer()に対してチェーンは機能しませんでした。両方の戻り値は次のようにモックされます。
nodeAutoIndexer = (AutoIndexer<Node>) mock(AutoIndexer.class);
relAutoIndexer = mock(RelationshipAutoIndexer.class);
では、何が問題を引き起こしているのでしょうか?
全く問題ありません。
次の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つ目は、モックのindexManager(最初の行で作成)に、getNodeAutoIndexerメソッドが呼び出されたときにnodeAutoIndexerを返すように指示しています。
そして、最後の行はgraphDb.index()を呼び出し、モックのindexManager(2行目でそれを行うように指示した)を返し、このindexManager(最初の行で作成したモック)に、getRelationshipAutoIndexerメソッドが呼び出されたときにrelAutoIndexerを返すように要求します。と呼ばれます。
最後の行が機能するのは、indexメソッドが呼び出されたときに何を返すかをモックgraphDbに指示したからです。これを以前に行っていない場合、モックのgraphDb.index()メソッドはnullを返し、NPEがあったはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加