Domanda

A volte, vuoi testare un metodo di classe e vuoi fare un'aspettativa su una chiamata di un metodo di super classe. Non ho trovato il modo di fare questa aspettativa in Java usando easymock o jmock (e penso che non sia possibile).

Esiste una soluzione (relativa) pulita, per creare un delegato con la logica del metodo super class e quindi impostare aspettative su di essa, ma non so perché e quando usare quella soluzione ¿idee / esempi?

Grazie

È stato utile?

Soluzione

Beh, puoi se vuoi. Non so se hai familiarità con JMockit , vai a dare un'occhiata. La versione attuale è 0.999.17 Nel frattempo, diamo un'occhiata ...

Supponi la seguente gerarchia di classi:

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

Quindi, usando JMockit nel tuo FooTest.java puoi confermare che stai effettivamente chiamando a Bar da 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();
}

Altri suggerimenti

Espandendo sulla risposta @Cem Catikkas, usando 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);
}

Non è necessaria la classe statica annotata con @MockClass, è sostituita dalla classe MockUp.

Non credo che deriderei una super chiamata: mi sembra che il comportamento sia parte del comportamento della classe stessa, piuttosto che il comportamento di una dipendenza. Il deridere sembra sempre che debba avere a che fare con le dipendenze più di ogni altra cosa.

Hai un buon esempio del tipo di chiamata che vuoi deridere? Se vuoi deridere una chiamata come questa, varrebbe la pena considerare la composizione anziché l'eredità?

Esistono diversi test che fanno proprio questo (cioè specificano un richiamo previsto su un metodo superclasse) usando l'API JMockit Expectations, nella suite di test di esempio Transizioni animate. Ad esempio, FadeInTest test case.

No, non c'è modo di deridere i metodi super class con jMock .

Tuttavia esiste una soluzione rapida e sporca al tuo problema. Supponiamo di avere la classe A e la classe B si estende a A. Si desidera deridere il metodo Aa () su B. È possibile introdurre la classe C di estensioni B nel codice di test e sovrascrivere il metodo Ca () (basta chiamare super o restituire null, id non importa). Dopo quella finta C e usa la finta ovunque, dove useresti B.

l'intercettazione di una super chiamata è troppo dettagliata. Non esagerare con l'isolamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top