Укажите класс универсального интерфейса для макета - PullRequest
5 голосов
/ 25 августа 2011

Я пытаюсь захватить аргумент, используя Mockito. Этот аргумент имеет тип List< MyClass >. Но я не могу найти правильный синтаксис для его указания.

Я могу сделать это:

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

Но я не получаю это для компиляции:

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

Есть ли способ?

Ответы [ 3 ]

15 голосов
/ 29 августа 2011

Должно работать, используя аннотацию @Captor:

@Captor
    private ArgumentCaptor<ArrayList<SomeType>> captor;
4 голосов
/ 25 августа 2011

К сожалению, нет, .class вернет только объект Class<List>, где List является необработанным типом.Реализация не идеальна, и информация о вложенных типах не может быть получена с помощью .class.Что-то вроде List<Foo>.class является недопустимым синтаксисом, потому что такого объекта Class<List<Foo>> нигде не существует.

3 голосов
/ 25 августа 2011

Я думаю, это потому, что 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;
...