Pregunta

A veces, desea probar un método de clase y desea hacer una expectativa en una llamada de un método de súper clase. No encontré una manera de hacer esta expectativa en java usando easymock o jmock (y creo que no es posible).

Hay una solución limpia (relativa), para crear un delegado con la lógica del método de la super clase y luego establecer expectativas en ella, pero no sé por qué y cuándo usar esa solución & # 191; ¿alguna idea / ejemplo?

Gracias

¿Fue útil?

Solución

Bueno, puedes si quieres. No sé si está familiarizado con JMockit , vaya a comprobarlo. La versión actual es 0.999.17 Mientras tanto, echémosle un vistazo ...

Supongamos la siguiente jerarquía de clases:

public class Bar {
    public void bar() {
        System.out.println("Bar#bar()");
    }
}

public class Foo extends Bar {
    public void bar() {
        super.bar();
        System.out.println("Foo#bar()");
    }
}

Luego, al utilizar JMockit en su FooTest.java , puede validar que está haciendo una llamada a la Barra desde Foo .

@MockClass(realClass = Bar.class)
public static class MockBar {
    private boolean barCalled = false;

    @Mock
    public void bar() {
        this.barCalled = true;
        System.out.println("mocked bar");
    }
}

@Test
public void barShouldCallSuperBar() {
    MockBar mockBar = new MockBar();
    Mockit.setUpMock(Bar.class, mockBar);

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);

    Mockit.tearDownMocks();
}

Otros consejos

Ampliando la respuesta de @Cem Catikkas, utilizando JMockit 1.22:

@Test
public void barShouldCallSuperBar() {
    new MockUp<Bar>() {
        @Mock
        public void bar() {
            barCalled = true;
            System.out.println("mocked bar");
        }
    };

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);
}

No es necesaria la clase estática anotada con @MockClass, se reemplaza por la clase MockUp.

No creo que me burle de una súper llamada, me parece que el comportamiento es parte del comportamiento de la clase en sí, en lugar del comportamiento de una dependencia. La burla siempre se siente como si tuviera que ver con dependencias más que con cualquier otra cosa.

¿Tienes un buen ejemplo del tipo de llamada que quieres simular? Si quieres burlarte de una llamada como esta, ¿valdría la pena considerar la composición en lugar de la herencia?

Hay varias pruebas que hacen precisamente eso (es decir, especifican una invocación esperada en un método de superclase) utilizando la API de expectativas de JMockit, en el conjunto de pruebas de muestra de Transiciones animadas. Por ejemplo, el FadeInTest caso de prueba.

No, no hay manera de burlarse de los métodos de la super clase con jMock .

Sin embargo, hay una solución rápida y sucia para su problema. Supongamos que tiene clase A y la clase B se extiende A. Desea simular el método Aa () en B. Puede introducir la clase C se extiende B en su código de prueba y anular el método Ca () (simplemente llame a super o a devolver nulo, id no importa). Después de ese simulacro C y usa el simulacro en todas partes, donde usarías B.

interceptar una súper llamada es demasiado detallado. No exagere el aislamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top