Frage

Manchmal wollen Sie eine Klassenmethode testen, und Sie wollen eine Erwartung auf einem Anruf einer Superklassenmethode zu tun. Ich habe nicht einen Weg gefunden, diese Erwartung in Java zu tun mit EasyMock oder JMock (und ich denke, es ist nicht möglich).

Es gibt eine (relative) saubere Lösung, einen Vertreter mit der Superklassenmethode Logik zu erstellen und dann setzte die Erwartungen an sie, aber ich weiß nicht, warum und wann verwenden, die Lösung ¿irgendwelche Ideen / Beispiele?

Danke

War es hilfreich?

Lösung

Nun, Sie können, wenn Sie wollen. Ich weiß nicht, ob Sie vertraut sind mit JMockit , gehen check it out. Die aktuelle Version ist 0.999.17 In der Zwischenzeit lassen Sie uns einen Blick an ihm nehmen ...

Nehmen wir die folgende Klassenhierarchie:

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

Dann, mit JMockit in Ihrem FooTest.java können Sie bestätigen, dass Sie tatsächlich einen Anruf von Bar Foo zu machen.

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

Andere Tipps

Der Ausbau auf @Cem Catikkas Antwort, mit 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);
}

Keine Notwendigkeit für die statische Klasse mit @MockClass kommentierte, es durch die MockUp Klasse ersetzt wird.

Ich glaube nicht, dass ich ein Super Anruf verspotten würde - es fühlt sich für mich wie das Verhalten dort Teil des Verhaltens der Klasse selbst, anstatt das Verhalten einer Abhängigkeit ist. Mocking immer fühlt sich an wie es sollte als alles andere mit Abhängigkeiten mehr zu tun.

Haben Sie ein gutes Beispiel für die Art von Anruf haben Sie heraus verspotten wollen? Wenn Sie einen Anruf wie diese verspotten wollen, wäre es eine Überlegung wert, Komposition statt Vererbung?

Es gibt mehrere Tests, die nur tun, dass (dh geben Sie einen erwarteten Aufruf auf einer Super-Klasse-Methode) unter Verwendung der JMockit Erwartungen API, in der Animationsübergänge Probe-Test-Suite. Zum Beispiel kann die FadeInTest Testfall.

Nein, es gibt keine Möglichkeit, Super-Klasse Methoden der spöttischen mit JMock .

Allerdings gibt es eine schnelle und unsaubere Lösung für Ihr Problem. Angenommen, Sie haben Klasse A und Klasse B erweitert A. Sie wollen Methode Aa verspotten () auf B. Sie einführen Klasse C erweitert B in Ihrem Testcode und überschreiben die Methode Ca () (einfach super mitgehen oder null zurück, id ist egal). Nach diesem Mock-C und die Mock überall verwenden, wo werden Sie B verwenden.

einen Super Anruf Abfangen ist viel zu feinkörnig. Übertreiben die Isolierung nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top