Mockito ArrayList <String> проблема
У меня есть метод, который я пытаюсь unit test. Этот метод принимает параметр как ArrayList и делает с ним что-то. Макет, который я пытаюсь определить, это:
ArrayList<String> mocked = mock(ArrayList.class);
который дает предупреждение [unchecked] unchecked conversion.
ArrayList<String> mocked = mock(ArrayList<String>.class);
дает мне ошибку.
Кто-нибудь хочет рассказать мне о том, что я делаю неправильно?
Ответы
Ответ 1
Альтернативой является использование аннотации @Mock, с тех пор Mockito может использовать отражение типа для поиска родового типа:
public class MyTest {
@Mock
private ArrayList<String> mockArrayList;
...
public void setUp() {
MockitoAnnotations.initMocks(this);
}
public void testMyTest() {
when(mockArrayList.get(0)).thenReturn("Hello world");
String result = mockArrayList.get(0);
assertEquals("Should have the correct string", "Hello world", result);
verify(mockArrayList).get(0);
}
}
Ответ 2
ArrayList<String>.class
- это конструкция, не поддерживаемая компилятором Java.
Для первой попытки вы должны сделать это:
@SuppressWarnings( "unchecked" )
ArrayList<String> mocked = mock(ArrayList.class);
Это происходит потому, что метод mock
может возвращать только необработанный тип. В общем случае нехорошо использовать необработанные типы, поскольку это может привести к ошибкам во время выполнения. В вашем случае это прекрасно, потому что вы знаете, что mocked
в любом случае не является REAL ArrayList<String>
.
Просто общая рекомендация об аннотации @SuppressWarnings( "unchecked" )
. Постарайтесь максимально приблизить его к источнику проблемы. Например, вы можете поместить его только для объявления переменной, или вы можете подавить его для всего метода. В общем, подавляйте его для переменной, потому что в противном случае широкая аннотация метода может подавлять другие проблемы в вашей функции.