junit - test - ¿Cómo uso Mockito para simular un método protegido?
mockito maven (3)
Esto no es un problema con Mockito, pero sí con Java. Desde donde llamas al método, no tienes visibilidad. Es por eso que 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 burlada
- cambie la visibilidad del método si puede
- crea una clase local (interna) que amplíe la clase burlada, luego simula esta clase local. Como la clase sería local, tendrías visibilidad del método.
Estoy usando Mockito 1.9.5. ¿Cómo me burlo de lo que regresa de un método protegido? Tengo este método protegido ...
protected JSONObject myMethod(final String param1, final String param2)
{
…
}
Sin embargo, cuando intento hacer esto en JUnit:
final MyService mymock = Mockito.mock(MyService.class, Mockito.CALLS_REAL_METHODS);
final String pararm1 = “param1”;
Mockito.doReturn(myData).when(mymock).myMethod(param1, param2);
En la última línea, aparece un error de compilación "El método ''myMethod'' no está visible." ¿Cómo uso Mockito para simular métodos protegidos? Estoy abierto a actualizar mi versión si esa es la respuesta.
John B tiene razón, esto se debe a que el método que intentas probar está protegido, no es un problema con Mockito.
Otra opción además de las que ha enumerado sería usar la reflexión para obtener acceso al método. Esto le permitirá evitar cambiar el método que está probando y evitar cambiar el patrón que usa para escribir pruebas, y dónde almacena estas pruebas. He tenido que hacer esto yo mismo para algunas pruebas en las que no me permitieron cambiar la base de códigos existente que incluía una gran cantidad de métodos privados que debían probarse en unidades.
Estos enlaces explican Reflection y cómo usarlo muy bien, así que los enlazaré en lugar de copiarlos:
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 protectedFunction() {
return "You can see me now!";
}
}
@Mock
MyClassMock myClass = mock(MyClassMock.class);
@Test
public void myClassPublicFunctionTest() {
when(myClass.publicFunction()).thenCallRealMethod();
when(myClass.protectedFunction()).thenReturn("jk!");
}
}