簡體   English   中英

Mockito:驗證通用列表作為參數

[英]Mockito: Verify generic list as argument

我被困試圖驗證一個偵聽器實現的參數。

來自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));
}

提前致謝。

您的轉換失敗,因為您正在將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));
ArgumentCaptor<List<EditJobSettingsSet>> argument = 
    (List<EditJobSettingsSet>) ArgumentCaptor.forClass(List.class);

您正在嘗試使用List<EditJobSettingsSet>初始化ArgumentCaptor<List<EditJobSettingsSet>>類型的ArgumentCaptor<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>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM