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

提前谢谢。

您的强制转换失败,因为您正在将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.forClass(List.class)的结果(类型为ArgumentCaptor)强制转换为List。这没有道理。你想要的是

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>>

最新更新