2017-12-20 14 views
0

私は自分のメソッドをテストしたいと思います。アイテムと行のベクトルをそれぞれ調べる必要があります。Mockitoを使って各ループを正しくモックする方法は?

Itemクラス(テスト内)からgetRows()を呼び出すと、常に得たい結果ベクトルを作成しました。

問題は、テストのgetRowsメソッドの結果が常に空であるため、ここでdoReturn文が正しく動作していないことです。

私は何かに間違っていますか?モックベクターは試験方法のパラメータではなく、テスト対象クラスのフィールドであるとして

class MyServiceTest { 
@Mock 
private Item mockedItem; 

@Mock 
private Row mockedRow; 

@InjectMocks 
@Spy 
private MyService myService; 

@Test 
public void testMyMethod() { 
    Vector<Row> rows = new Vector<Row>(); 
    Row row = new Row(); 
    rows.add(row); 

    doReturn(rows).when(mockedItem).getRows(); 

    ... 
    //some code to test the service 

    } 
} 

class MyService { 
    protected SomeObject myMethod(Vector<Item> items) {  
     for(Item item : items) { 
      for(Row row : item.getRows()) { 
       //cannot get here while debugging the test 

       //some code 
      } 
     } 
    ... 
    } 
} 
class Item { 
... 
    public Vector<Row> getRows(){ 
     //return some vector of rows 
    } 
} 
+0

'mockedItem'が使用されている場所でテストコードを共有できますか?私はむしろ、それが嘲笑されたサービスではないと疑い、 'doReturn'は動作していないということではない。 – Mureinik

+0

クラス 'Row'のコードも表示できますか? –

+0

私は正しく理解しているかどうかはわかりませんが、どこでも使用されていません。 doReturnの後、私はサービスを呼び出してからアサートします。 –

答えて

4

@InjectMockは無用です。
だから、何も注入する必要はありません。

あなたがする必要があるのは、各要素がgetRows():予想される振る舞いを持つモックであるItemのVector:スタブ付き行を返すことです。ここで

はサンプルコードです:

// create stubbed rows 
Vector<Row> rows = new Vector<Row>(); 
Row row = new Row(); 
rows.add(row); 

// mock items Vector 
Vector<Item> items = new Vector<>(); 
for (...){ // nb element to create 
    Item mockedItem = Mockito.mock(Item.class); 
    doReturn(rows).when(mockedItem).getRows(); 
    items.add(mockedItem); 
} 

次にベクトル渡すことによって、あなたのテストメソッドを呼び出す:Vectorは古いものと欠陥のあるコレクションです

new MyService().myMethod(items); 

注意を。
競合状態を処理する必要がない場合は、実装として、ListArrayListというよりむしろ

関連する問題