Solución:
Esto no es un problema con Mockito, sino con el antiguo Java. Desde donde está llamando al método, no tiene visibilidad. Por eso es un problema de tiempo de compilación en lugar de un problema de tiempo de ejecución.
Un par de opciones:
- declare su prueba en el mismo paquete que la clase simulada
- cambie la visibilidad del método si puede
- cree una clase local (interna) que amplíe la clase simulada, luego simule esta clase local. Dado que la clase sería local, tendría visibilidad del método.
Respondiendo a la solicitud de una muestra de código de la opción 3 de la respuesta de John B:
public class MyClass {
protected String protectedMethod() {
return "Can't touch this";
}
public String publicMethod() {
return protectedMethod();
}
}
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
class MyClassMock extends MyClass {
@Override
public String protectedMethod() {
return "You can see me now!";
}
}
@Mock
MyClassMock myClass = mock(MyClassMock.class);
@Test
public void myClassPublicMethodTest() {
when(myClass.publicMethod()).thenCallRealMethod();
when(myClass.protectedMethod()).thenReturn("jk!");
}
}
Puede usar Spring’s ReflectionTestUtils para usar su clase tal como está y sin necesidad de cambiarla solo para pruebas o envolverla en otra clase.
public class MyService {
protected JSONObject myProtectedMethod(final String param1, final String param2) {
return new JSONObject();
}
public JSONObject myPublicMethod(final String param1) {
return new JSONObject();
}
}
Y luego en Prueba
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
@Mock
private MyService myService;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(myService.myPublicMethod(anyString())).thenReturn(mock(JSONObject.class));
when(ReflectionTestUtils.invokeMethod(myService, "myProtectedMethod", anyString(), anyString())).thenReturn(mock(JSONObject.class));
}
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)