Gibt es in JMockit eine Möglichkeit, die ursprüngliche Methode von einer verspotteten Methode aufzurufen?

In meiner Mock-Klasse verspotte ich die Methode foo (). Für einige Testfälle möchte ich, dass die Mock-Implementierung von foo () einen speziellen Wert zurückgibt. Für andere Testfälle möchte ich die echte Implementierung von foo () verwenden. In meiner Mock-Klasse ist ein Boolescher Wert definiert, damit ich in der Mock-Methode bestimmen kann, ob ich den speziellen Wert zurückgeben oder die "echte" Methode verwenden möchte. Das Problem ist, ich kann nicht scheinen, herauszufinden, wie man die reale Methode von der verspotteten Methode aufruft.

Ich habe festgestellt, dass Sie ein spezielles Element im Scheinobjekt mit dem Namen "it" definieren können (mit dem Typ des Objekts, das verspottet wird). Auf diese Weise können Sie die reale Klasse aus der Scheinimplementierung referenzieren. Mein Plan war also, wenn ich die "echte" Implementierung von foo () aufrufen müsste, würde die Mock-Methode it.foo () aufrufen. Dies funktioniert jedoch nicht, da der Aufruf von it.foo () nur die Scheinversion erneut aufruft, nicht die echte Version, sodass ich eine unendliche Rekursion erleide.

ibt es eine Möglichkeit, dies zum Laufen zu bringe

EDIT: Mit einem Codebeispiel könnte es klarer werden. So sieht meine aktuelle Implementierung einer verspotteten Methode aus:

private RealClass it;
...
public SomeClass foo() {
    if(fakeIt) {
        return new SomeClass("fakevalue");
    } else {
        // doesn't work, just keeps calling the mock foo
        // in infinite recursion
        return it.foo();
    }
}

EDIT 2: Auch für die meisten meiner Testfälle mache ichNICH wollen die Mock-Implementierung. Mein erster Versuch war es also, Mockit.redefineMethods () nur in den Testfällen aufzurufen, in denen ich das Mock-Objekt benötigte. Aber das hat nicht funktioniert - es scheint, dass Sie dies nur innerhalb von Setup / Teardown tun können ... meine Mock-Implementierung wurde nie aufgerufen, als ich das versuchte.

HINWEISE ZUR LÖSUNG:

Zuerst dachte ich nicht, dass die gegebene Antwort funktioniert, aber nachdem ich ein bisschen mehr damit gespielt habe, scheint das Problem zu sein, dass ich JMockit "Core" -Methoden mit den "Annotation" -getriebenen Methoden gemischt habe. Anscheinend müssen Sie bei Verwendung der Annotation Mockit.setupMocks verwenden, nicht Mockit.redefineMethods (). Das hat endlich geklappt:

@Before 
public void setUp() throws Exception
{
    Mockit.setUpMocks(MyMockClass.class);
}

Then, für die Scheinklasse:

@MockClass(realClass = RealClass.class)
public static class MyMockClass {
    private static boolean fakeIt = false;
    private RealClass it;

    @Mock(reentrant = true)
    public SomeClass foo() {
        if(fakeIt) {
            return new SomeClass("fakevalue");
        } else {
            return it.foo();
        }
    }
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage