2017-12-20 35 views
0

내 방법을 테스트하고 싶습니다. 각 항목과 행의 벡터를 조롱하여 각각을 처리해야합니다.Mockito를 사용하여 각 루프를 올바르게 조롱하는 방법?

필자는 (테스트 내에서) Item 클래스에서 getRows()를 호출 할 때 항상 얻고 자하는 결과 벡터를 준비했습니다.

문제는 doReturn 문이 올바르게 작동하지 않기 때문에 테스트의 getRows 메소드 결과가 항상 비어 있다는 것입니다.

내가 뭔가 잘못 됐나요? 조롱 벡터는 시험 방법의 파라미터 시험 클래스가 아닌 필드가 그대로

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()의 예상 행동 모의이다 항목의 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); 
} 

그런 다음 벡터를 통과하여 테스트 메소드를 호출 : 벡터는 과거와 결함 컬렉션입니다

new MyService().myMethod(items); 

참고.
경쟁 조건을 처리 할 필요가없는 경우 구현보다는 다소 사용자가 ListArrayList입니다.