我在尝试验证侦听器实现的参数时遇到了问题。
来自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>>
。