指定要模拟的通用接口的类

时间:2011-08-25 15:20:39

标签: java generics mocking mockito

我正试图用Mockito捕捉一个论点。此参数的类型为List< MyClass >。但我找不到正确的语法来指定它。

可以这样做:

ArgumentCaptor< MyClass > captor = 
   ArgumentCaptor.forClass( MyClass.class );

但是我没有这个来编译:

ArgumentCaptor< List<MyClass> > captor = 
   ArgumentCaptor.forClass( List<MyClass>.class );

有办法吗?

3 个答案:

答案 0 :(得分:15)

它应该使用@Captor注释:

@Captor
    private ArgumentCaptor<ArrayList<SomeType>> captor;

答案 1 :(得分:4)

不幸的是,.class只返回Class<List>对象,其中List是原型。实现并不完美,无法使用.class获取嵌套类型信息。像List<Foo>.class之类的东西是无效的语法,因为在任何地方都不存在这样的Class<List<Foo>>对象。

答案 2 :(得分:3)

我认为这是因为Java没有静态地确定参数化类的类型。

这与编译方式相同:

Class<?> c1 = ArrayList<String>.class; 

而且这在类型解析问题List之上都不是一个接口:

Class<?> c2 = List<String>.class; 

但这确实可以编译,你可以做类似的事情:

public class MyList implements List<String> {
    ... the List's methods to implement ...
}

// and later in the code:

Class<?> c3 = MyList.class;