Не удаётся использовать Mockito.spy в junit
Пытаюсь понять как пользоваться Mockito и никак не получается использовать Mockito.spy Вот такой вот код (просто как образец):
@Test
public void testTest(){
Player.Point newPoint = new Player.Point(4, 5);
Player.Point spyPoint = spy(newPoint);
int x = 1;
int y = 1;
when(spyPoint.isDistShot(x, y)).thenReturn(false);
Assert.assertFalse(spyPoint.isDistShot(x, y));
}
junit (кажется это он) ругается вот такими словами и крашится:
WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.mockito.cglib.core.ReflectUtils$2 (file:/C:/Users/Ocean/.m2/repository/org/mockito/mockito-all/1.10.19/mockito-all-1.10.19.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.mockito.cglib.core.ReflectUtils$2 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
Не могу понять, тест ругается на рефлексию, при этом если использовать не spy а mock - то всё нормально.
Но с моком я не знаю как создать объект класса с параметрами в конструкторе. Подскажите пожалуйста, как правильно использовать spy в тестировании?
Ответы (1 шт):
Решение
Замените
when(spyPoint.isDistShot(x, y)).thenReturn(false);
на
doReturn(false).when(spyPoint).isDistShot(x, y);
Пояснение
spy использует реальный объект, поэтому когда вы вызываете spyPoint.isDistShot(x, y), моки еще не настроены и происходит вызов метода оригинального объекта.
P.S. Вы предоставили информацию о предупреждении, которое никак не связано с описанной проблемой. Стектрейс реального исключения остался загадкой.