макет метода с универсальным типом возврата с mockito - PullRequest
0 голосов
/ 23 декабря 2011


Вот моя проблема:

public interface Containter extends ModelElement{
     List<? extends ModelElement> getChildren();
}

Есть несколько классов, реализующих контейнер, и я хочу их высмеять:

public class MockMama {
   public static <T extends Containter, Y extends ModelElement> T bornContainer(Class<T> clazz, Y ... children) {
           T container = mock(clazz);
           when(container.getChildren()).thenReturn(Arrays.asList(children));
           return container;
   }
}

Но это не работает.Eclipse говорит: «Метод thenReturn (List) в типе OngoingStubbing> не применим для аргументов (List)».Я также пытался передать локально объявленную переменную типа List <? extends ModelElement> в thenReturn, но это тоже не помогло.
Любая помощь высоко ценится и приветствуется:)

Ответы [ 2 ]

2 голосов
/ 24 декабря 2011

Ваша проблема в том, что нет гарантии, что тип, возвращаемый getChildren (), соответствует типу аргумента varargs вашему методу bornContainer. Так что компилятор вправе жаловаться на это. Использование промежуточной локальной переменной действительно превращает ошибку компилятора в потенциальную проблему времени выполнения.

Мне кажется, что ваш "контейнер" действительно должен быть универсальным классом, потому что его поведение зависит от типа, который находится в списке, который возвращает getChildren (). Посмотрите на мою переписать ваш пример. Это не имеет ошибок компиляции или предупреждений.

public interface Containter<Z extends ModelElement> extends ModelElement{      
    List<Z> getChildren(); 
}

public class MockMama {    
    public static <Y extends ModelElement, T extends Containter<Y>> T bornContainer( Class<T> clazz, Y ... children) {            
        T container = mock(clazz);            
        when(container.getChildren()).thenReturn( Arrays.asList(children));            
        return container;    
    } 
}

Надеюсь, это поможет.

0 голосов
/ 23 декабря 2011

Обычно в тестах вы можете игнорировать необработанные или необработанные предупреждения типа.Поэтому обычно безопасно аннотировать ваш тест с помощью директивы компилятора, такой как @SupressWarning("unchecked").

...