una tienen sirve sintaxis ser qué que puede para interfaz interfaces instanciada ejemplos ejemplo común clases clase abstractas abstracta java unit-testing mocking jmockit

java - tienen - Burlarse de métodos estáticos no públicos en clases abstractas con JMockit?



sintaxis de clase abstracta en java (2)

Tengo la siguiente clase:

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

Quiero burlarme de este método Decido usar JMockit . Entonces creo una clase falsa:

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()); } }

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

Editar 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 simulado debe ser público, puede dejar el método original tal como está.


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

No sé por qué esto funciona, aunque 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"; } }


Aparentemente, la nueva forma de hacerlo es usar MockUp<T>

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

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

Lo he implementado en un proyecto de ejemplo en github .