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