Mockito — это очень хороший инструмент, позволяющий изолированно тестировать любой класс. В этой статье рассматривается работа этой библиотеки с обобщениями. Представьте, что у нас существует метод, возвращающий список элементов параметризованного типа с ограничением. И в тестах нам заменить класс поддельным с помощью Mockito, а также возвращаемое значение. Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@RunWith(MockitoJUnitRunner.class) public class MainTest { public static class A { public List<? extends Parent> method1() { return new ArrayList<Child>(); } } public static class Parent { } public static class Child extends Parent { } @Test public void test1() { List<Child> childList = new ArrayList<>(); A a = Mockito.mock(A.class); // Не сработает: Mockito.when(a.method1()).thenReturn(childList); } } |
Этот код приведёт к ошибке:
1 2 3 |
The method thenReturn(List<capture#1-of ? extends MainTest.Parent>) in the type OngoingStubbing<List<capture#1-of ? extends MainTest.Parent>> is not applicable for the arguments (List<MainTest.Child>) |
Корректно мокнуть (я не знаю, как перевести это слово корректно, чтобы было понятно) можно с помощью doReturn:
1 2 3 4 5 6 7 8 9 10 11 |
... @Test public void test1() { List<Child> childList = new ArrayList<>(); A a = Mockito.mock(A.class); // Не сработает: Mockito.doReturn(childList).when(a).method1(); } } |