В классе FTPFile
нет ничего особенного, что могло бы предотвратить насмешку. К сожалению, используя Mockito, вы не можете смоделировать массивы , так как они являются окончательными.
Этот пример кода должен продемонстрировать проблему:
import static org.mockito.Mockito.*;
import org.junit.Test;
public class TestMockArrays {
interface Animal {
String getName();
}
@Test
public void testMockArray() {
final Animal[] mockArray = mock(Animal[].class);
when(mockArray[0].getName()).thenReturn("cat");
when(mockArray[1].getName()).thenReturn("dog");
when(mockArray[2].getName()).thenReturn("fish");
print1st3(mockArray);
}
public static void print1st3(final Animal[] animals) {
System.out.println(animals[0].getName() + " " + animals[1].getName() + " " + animals[2].getName());
}
}
Запустите его, и вы увидите, что в результате вы получите сообщение об ошибке, в котором четко указана проблема:
org.mockito.exceptions.base.MockitoException:
Не может издеваться над шпионским классом [LTestMockArrays $ Animal;
Мокито не может издеваться / шпионить за:
- выпускные занятия
- анонимные занятия
- примитивные типы
Самое простое решение - использовать расширение для Mockito, такое как Powermock , которое позволяет обойти определенные ограничения на способность Mockito к манипулированию с помощью манипулирования байт-кодом. Затем вы можете создать фиктивный массив, добавив следующие аннотации в свой тестовый класс junit:
@RunWith(PowerMockRunner.class) // Need to run with Powermock runner
@PrepareForTest(FTPFile[].class) // We prepare FTPFile[] class for test because it's final
тогда в вашем тестовом методе вы создадите Mockito mock как обычно:
FTPFile[] mockFTPFiles = mock(FTPFile[].class);