Java Mockito:验证泛型列表作为参数
我一直在尝试验证侦听器实现的参数Java Mockito:验证泛型列表作为参数,java,mockito,verify,Java,Mockito,Verify,我一直在尝试验证侦听器实现的参数 侦听器界面中的方法: public void settingsAdded(List<EditJobSettings> addedSettings); public void settings added(列表添加的设置); 我要做的是检查列表中是否存在预期的对象 测试(忽略不相关的代码): @测试 public void initiallyAddColorAndAlignTile()初始值{ mSettings.add(mColorSetting
侦听器
界面中的方法:
public void settingsAdded(List<EditJobSettings> addedSettings);
public void settings added(列表添加的设置);
我要做的是检查列表中是否存在预期的对象
测试(忽略不相关的代码):
@测试
public void initiallyAddColorAndAlignTile()初始值{
mSettings.add(mColorSetting);
//此方法调用侦听器方法并将添加的设置作为参数传递
mStatusNotifier.notifySettingsUpdates(mSettings);
//这里我陷入了困境:这无法编译,但我找不到如何解决这个问题。有没有办法将泛型列表指定为参数?
ArgumentCaptor参数=(List)ArgumentCaptor.forClass(List.class);
验证(mEditJobListener).settingsAdded(argument.capture());
assertTrue(argument.getValue().contains(mColorSettings));
}
提前谢谢
ArgumentCaptor<List<EditJobSettingsSet>> argument =
(List<EditJobSettingsSet>) ArgumentCaptor.forClass(List.class);
我不确定有没有办法避免在这里使用ArgumentCaptor
我不确定是否有办法避免在此处使用
ArgumentCaptor
。您的强制转换失败,因为您正在将ArgumentCaptor
强制转换到列表中
如果您已经在调用MockitoAnnotations.initMocks(this)
,则只需将字段声明为,这是减少重复的最简单方法:
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]
}
}
公共类测试{
@模仿某类人模仿某类人;
@捕获者论据捕获者论据;
@在public void initializeMocks()之前{
//如果您@RunWith(MockitoJUnitRunner.class),则会自动调用该函数。
initMocks(this);
}
@Test public void yourTest(){
//[在此插入设置]
验证(mEditJobListener).settingsAdded(argument.capture());
//[在此插入断言]
}
}
否则,您将不得不使用近似于此的方法(我将在可能的情况下进行测试):
//如果没有强制转换到(ArgumentCaptor)和一些@SuppressWarnings,可能无法工作。
ArgumentCaptor参数=
(辩手)
((ArgumentCaptor)ArgumentCaptor.forClass(List.class));
您的强制转换失败,因为您正在将ArgumentCaptor
强制转换到列表中
如果您已经在调用MockitoAnnotations.initMocks(this)
,则只需将字段声明为,这是减少重复的最简单方法:
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]
}
}
公共类测试{
@模仿某类人模仿某类人;
@捕获者论据捕获者论据;
@在public void initializeMocks()之前{
//如果您@RunWith(MockitoJUnitRunner.class),则会自动调用该函数。
initMocks(this);
}
@Test public void yourTest(){
//[在此插入设置]
验证(mEditJobListener).settingsAdded(argument.capture());
//[在此插入断言]
}
}
否则,您将不得不使用近似于此的方法(我将在可能的情况下进行测试):
//如果没有强制转换到(ArgumentCaptor)和一些@SuppressWarnings,可能无法工作。
ArgumentCaptor参数=
(辩手)
((ArgumentCaptor)ArgumentCaptor.forClass(List.class));
我没有用注释测试它,但我在最后测试了代码,它没有编译。@JBNizet我知道注释是有效的,并且是在捕获器中处理复杂泛型的首选方法。我不记得有多容易原谅不安全的强制转换,或者通过对(ArgumentCaptor)
进行强制转换和/或使用@SuppressWarnings
可以静音多少。当我手边有一个IDE时将进行测试;同时更新答案。很抱歉反应太晚,最终解决了。@Captor很酷,我还不知道。谢谢你的回答!我没有用注释测试它,但我在最后测试了代码,它没有编译。@JBNizet我知道注释可以工作,并且是在捕获器中处理复杂泛型的首选方法。我不记得有多容易原谅不安全的强制转换,或者通过对(ArgumentCaptor)
进行强制转换和/或使用@SuppressWarnings
可以静音多少。当我手边有一个IDE时将进行测试;同时更新答案。很抱歉反应太晚,最终解决了。@Captor很酷,我还不知道。谢谢你的回答+1,另一个答案是我现在的代码,关于愚蠢的演员阵容你是对的…:)。谢谢你的回答+1,另一个答案是我现在的代码,关于愚蠢的演员阵容你是对的…:)。谢谢你的回答!
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));