Saltar al contenido

¿Cómo uso Mockito para simular un método protegido?

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *