Saltar al contenido

Mockito Cómo burlarse solo de la llamada de un método de la superclase

Luego de de esta prolongada compilación de datos resolvimos este inconveniente que presentan algunos de nuestros lectores. Te compartimos la respuesta y nuestro deseo es serte de gran apoyo.

Solución:

Si realmente no tiene una opción para refactorizar, puede simular / eliminar todo en la llamada al súper método, por ejemplo

    class BaseService 

        public void validate()
            fail(" I must not be called");
        

        public void save()
            //Save method of super will still be called.
            validate();
        
    

    class ChildService extends BaseService

        public void load()

        public void save()
            super.save();
            load();
        
    

    @Test
    public void testSave() 
        ChildService classToTest = Mockito.spy(new ChildService());

        // Prevent/stub logic in super.save()
        Mockito.doNothing().when((BaseService)classToTest).validate();

        // When
        classToTest.save();

        // Then
        verify(classToTest).load();
    

No, Mockito no admite esto.

Puede que esta no sea la respuesta que está buscando, pero lo que está viendo es un síntoma de no aplicar el principio de diseño:

Favorecer la composición sobre la herencia

Si extrae una estrategia en lugar de extender una superclase, el problema desaparece.

Sin embargo, si no se le permite cambiar el código, pero debe probarlo de todos modos, y de esta manera incómoda, todavía hay esperanza. Con algunas herramientas de AOP (por ejemplo, AspectJ) puedes tejer código en el método de superclase y evitar su ejecución por completo (puaj). Esto no funciona si está usando proxies, debe usar la modificación del código de bytes (ya sea tejido en tiempo de carga o tejido en tiempo de compilación). Hay marcos de burla que también admiten este tipo de trucos, como PowerMock y PowerMockito.

Te sugiero que optes por la refactorización, pero si esa no es una opción, te divertirás mucho con la piratería.

Considere refactorizar el código del método ChildService.save () a un método diferente y pruebe ese nuevo método en lugar de probar ChildService.save (), de esta manera evitará llamadas innecesarias al súper método.

Ejemplo:

class BaseService   
    public void save() ...  


public Childservice extends BaseService   
    public void save()  
        newMethod();    
        super.save();
    
    public void newMethod()
       //some codes
    
 

¡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 *