2014-06-06 26 views
3

使用Mockito我試圖驗證某些對象被添加並從另一個對象中刪除。但是這個工作的函數存儲了一個集合的實例,更新了這個集合的內容,並將它傳遞給我的對象。如何驗證內容更改的集合的方法調用?

當我然後嘗試驗證addAll和removeAll被調用了正確的對象時,看起來Mockito實際上持有對集合的引用,因此不知道集合包含何時調用這些方法。一個簡單的例子:

class MySUT 
{ 
    private final Collection<Object> objects = new ArrayList<>(); 
    public MySUT(Object firstObject) 
    { 
     objects.add(firstObject); 
    } 

    public void addNewObject(Collection<Object> other, Object newObject) 
    { 
     other.removeAll(objects); 
     objects.clear(); 

     objects.add(newObject); 
     other.addAll(objects); 
    } 
} 

@Test 
public void test() 
{ 
    Object firstObject = mock(Object.class); 
    Object newObject = mock(Object.class); 
    Collection<Object> myObject = mock(Collection.class); 

    MySUT sut = new MySUT(firstObject); 

    sut.addNewObject(myObject, newObject); 

    verify(myObject).removeAll(eq(Collections.singletonList(firstObject))); 
    verify(myObject).addAll(eq(Collections.singletonList(newObject))); 
} 

此測試失敗聲稱removeAll方法被稱爲用含newObject這顯然,這不是一個列表。

我不能使用ArgumentCaptor,因爲它的工作方式相同 - 所以我如何驗證正確的東西已經傳遞給myObject(顯然在真正的代碼中myObject不是一個簡單的集合)?

回答

1

好的,我已經完成了,並且認爲我會分享以防其他人有同樣的問題。我已經使存根返回一個答案,並在答案實現中添加了新的列表。然後我堅持反對。這有點討厭,但它有效。

class MySUT 
{ 
    private final Collection<Object> objects = new ArrayList<>(); 
    public MySUT(Object firstObject) 
    { 
     objects.add(firstObject); 
    } 

    public void addNewObject(Collection<Object> other, Object newObject) 
    { 
     other.removeAll(objects); 
     objects.clear(); 

     objects.add(newObject); 
     other.addAll(objects); 
    } 
} 

@Test 
public void test() 
{ 
    Object firstObject = mock(Object.class); 
    Object newObject = mock(Object.class); 
    Collection<Object> myObject = mock(Collection.class); 

    MySUT sut = new MySUT(firstObject); 

    final List<Object> removeAllResult = new ArrayList<>(); 
    when(myObject.removeAll(anyCollectionOf(Object.class))).thenAnswer(new Answer<Object>() 
    { 
     @Override 
     public Object answer(InvocationOnMock invocation) throws Throwable 
     { 
      removeAllResult.addAll((Collection<Object>) invocation.getArguments()[0]); 
      return null; 
     } 
    }); 

    sut.addNewObject(myObject, newObject); 

    verify(myObject).removeAll(anyCollectionOf(Object.class)); 
    verify(myObject).addAll(anyCollectionOf(Object.class)); 

    assertThat(removeAllResult.get(0), equalTo(firstObject)); 
} 

如果其他人有更好的/替代的解決方案,我還是想知道:)

相關問題