2008-10-22 11 views
7

que tienen la clase siguiente:¿Mocking métodos públicos no estáticos en clases abstractas con JMockit?

public abstract class AbstractParent { 
    static String method() { 
     return "OriginalOutput"; 
    } 
} 

Quiero burlarse de este método. Decido usar JMockit. Así se crea una clase de simulacro:

public class MockParent { 
    static String method() { 
     return "MOCK"; 
    } 
} 

Y mi código de prueba se ve así:

public class RealParentTest { 

    @Before 
    public void setUp() throws Exception { 
     Mockit.redefineMethods(AbstractParent.class, MockParent.class); 
    } 


    @Test 
    public void testMethod() { 
     assertEquals(MockParent.method(),AbstractParent.method()); 
    } 

} 

Desafortunadamente esta prueba dice que los rendimientos AbstractParent "OriginalOutput" en lugar de "FALSO". ¿Alguna idea de por qué? ¿Estoy haciendo algo mal? Intenté también declarar mi clase falsa como abstracta, sin resultado.

Edite Tenga en cuenta que hacer que el método sea público hace que la prueba se ejecute sin problemas ... esto es extraño porque con JMockit se supone que puede simular métodos de cualquier alcance.

Respuesta Solo el método de prueba debe ser público, puede dejar el método original tal como está.

+0

Solo para el jugador que pasa ... la respuesta aceptada está ahora desactualizada ya que Mockit.redefineMethods está en desuso ... Estoy intentando encontrar el correcto. –

Respuesta

6

Encontré la solución: simplemente tiene que hacer público el método de simulación (el método original puede permanecer en su visibilidad original).

No sé por qué funciona pero la forma original no (alguien que lo hace es más que bienvenido), pero todo lo que tiene que hacer es simplemente cambiar la clase simulada en el ejemplo anterior a:

public class MockParent { 
    public static String method() { 
     return "MOCK"; 
    } 
} 
+1

Ni siquiera tiene que convertirlo en estático en MockParent. –

+1

jmockit solo tiene en cuenta los métodos públicos. Esto permite que su implementación simulada tenga métodos internos que no se corresponden con los métodos de la clase fuente –

+2

La razón por la cual el método simulado debe ser público es que JMockit modifica el método simulado para realizar una llamada al método simulado. Es decir, una llamada al método original se redirige desde el interior del mismo método al simulacro. Por lo tanto, el método de prueba debe ser accesible desde el punto donde se inserta la llamada. –

4

al parecer, la nueva manera de hacer esto es utilizar MockUp<T>

new MockUp<AbstractParent>(){ 
    @Mock String method() { 
     return "MOCK"; 
    } 
}; 

assertEquals("MOCK" AbstractParent.method()); 

Otra alternativa es aparentemente para continuar con algo como MockParent con un annonation @MockClass. No he hecho esto yo mismo ya que la otra versión en línea hace el trabajo.

Lo he implementado en un ejemplo project on github.

+0

El 'AbstractParent.method()' original es 'static'. De esta manera no se puede tomar para los métodos "estáticos". –

+3

@Adeel Me gustaría diferir https://github.com/gid79/q224721-jmockit-non-public-methods –

+0

Lo siento por mi comentario anterior, en realidad lo intenté pero no funcionaba realmente, entonces llegué a saber que eso fue por algo completamente diferente. +1 para proporcionar el ejemplo. –

Cuestiones relacionadas