2013-08-02 52 views
1

我被困在試圖驗證偵聽器實現的參數。Mockito:驗證泛型列表作爲參數

Listener接口的方法:

public void settingsAdded(List<EditJobSettings> addedSettings); 

我想要做的是檢查,如果預期的對象出現在列表中。

測試(左出不相關的代碼):

@Test 
public void initiallyAddColorAndAlignTile() { 

    mSettings.add(mColorSetting); 

    // This method calls the listener method and passes the added settings as argument 
    mStatusNotifier.notifySettingsUpdates(mSettings); 

    // Here I get stuck: this does not compile, but I can't find how to work around this. Is there a way to specify a generic list as argument? 
    ArgumentCaptor<List<EditJobSettingsSet>> argument = (List<EditJobSettingsSet>) ArgumentCaptor.forClass(List.class); 

    verify(mEditJobListener).settingsAdded(argument.capture()); 

    assertTrue(argument.getValue().contains(mColorSettings)); 
} 

預先感謝。

回答

2

由於您正在將ArgumentCaptor<stuff>投射到List<stuff>,您的演員表失敗。

如果你已經打電話MockitoAnnotations.initMocks(this),你可以聲明一個字段作爲@Captor,這是爲了減少重複最簡單的方法:

public class YourTest { 

    @Mock SomeClass someMock; 
    @Captor ArgumentCaptor<List<EditJobSettingsSet>> argument; 

    @Before public void initializeMocks() { 
    // This gets called automatically if you @RunWith(MockitoJUnitRunner.class). 
    MockitoAnnotations.initMocks(this); 
    } 

    @Test public void yourTest() { 
    // [insert setup here] 
    verify(mEditJobListener).settingsAdded(argument.capture()); 
    // [insert assertions here] 
    } 
} 

否則,你將不得不投一些逼近這個(我會在我可以測試):

// Might not work without the cast to (ArgumentCaptor) and some @SuppressWarnings. 
ArgumentCaptor<List<EditJobSettingsSet>> argument = 
    (ArgumentCaptor<List<EditJobSettingsSet>>) 
    ((ArgumentCaptor) ArgumentCaptor.forClass(List.class)); 
+0

我沒有用註解測試過它,但是我在最後測試了代碼,並且它不能編譯。 –

+0

@JBNizet我知道註釋的作品,並且是處理Captors中複雜泛型的首選方法。我不記得那些不安全的演員是如何原諒的,或者有多少人可以通過演員陣容來抵抗'(ArgumentCaptor)'和/或使用'@ SuppressWarnings'。將測試當我有一個IDE方便;在此期間更新答案。 –

+0

對於遲到的反應感到抱歉,最終發現了它。 @Captor非常酷,還不知道。感謝你的回答! – bas

2
ArgumentCaptor<List<EditJobSettingsSet>> argument = 
    (List<EditJobSettingsSet>) ArgumentCaptor.forClass(List.class); 

你試圖初始化ArgumentCaptor<List<EditJobSettingsSet>>類型的變量與List<EditJobSettingsSet>,並以澆注ArgumentCaptor.forClass(List.class)的結果(這是類型ArgumentCaptor的)到列表中。這沒有意義。你想要的是

ArgumentCaptor<List> argument = ArgumentCaptor.forClass(List.class); 
verify(mEditJobListener).settingsAdded((List<EditJobSettingsSet>) argument.capture()); 
List<EditJobSettingsSet> value = argument.getValue(); 
assertTrue(value.contains(mColorSettings)); 

我不知道有一種方法,以避免使用ArgumentCaptor<List<EditJobSettingsSet>>這裏。

+0

+1,對方的回答是我在我的代碼現在,你是對的傻投確實... :)。感謝你的回答! – bas