509 Stimmen

Mockito: Wie kann man überprüfen, ob die Methode auf einem Objekt aufgerufen wurde, das innerhalb einer Methode erstellt wurde?

Ich bin neu bei Mockito.

Wie kann ich Mockito verwenden, um zu überprüfen, dass die Klasse someMethod wurde genau einmal aufgerufen, nachdem foo herangezogen wurde?

public class Foo
{
    public void foo(){
        Bar bar = new Bar();
        bar.someMethod();
    }
}

Ich möchte den folgenden Kontrollanruf tätigen,

verify(bar, times(1)).someMethod();

donde bar ist eine nachgebildete Instanz von Bar .

7voto

John B Punkte 31552

Ja, wenn Sie es wirklich wollen / müssen, können Sie PowerMock verwenden. Dies sollte als letzter Ausweg betrachtet werden. Mit PowerMock können Sie veranlassen, dass ein Mock aus dem Aufruf des Konstruktors zurückgegeben wird. Führen Sie dann die Verifizierung mit dem Mock durch. Das heißt, csturtz's ist die "richtige" Antwort.

Hier ist der Link zu Scheinkonstruktion von neuen Objekten

5voto

Haakon Løtveit Punkte 898

Ich hatte genau dieses Problem heute, und ich wollte nicht PowerMock oder andere Sachen zu verwenden. Ich wollte nur einen Test machen, der sicherstellte, dass eine bestimmte Methode aufgerufen wurde. Ich fand diesen Beitrag und ich sah, dass niemand diesen Ansatz erwähnt hatte.

Eine Möglichkeit, dies zu erreichen, ohne weitere Abhängigkeiten oder Ähnliches hinzuzufügen, ist zwar ziemlich unkonventionell, aber sie funktioniert:

@Test
public void testSomeMethodIsCalledOnce() throws Exception {
    final AtomicInteger counter = new AtomicInteger(0);
    Mockito.when(someObject.theMethodIWant(anyString()))
        .then((Answer<ReturnValue>) __ -> {
            teller.incrementAndGet();
            return theExpectedAnswer;
        });
    theObjectUnderTest.theMethod(someTestValue);

    assertEquals(1, teller.get());
}

Das ist ziemlich einfach, und es ist leicht zu erkennen, was vor sich geht. Wenn die Methode, die ich will, aufgerufen wird (es ist hier gespottet), tun dieses Zeug. Dazu gehört auch ein Aufruf von incrementAndGet für den AtomicInteger. Sie かもしれない hier ein int[] verwenden, aber das ist meiner Meinung nach nicht so klar. Wir verwenden einfach etwas, das endgültig ist und das wir inkrementieren können. Das ist eine Einschränkung des Lambdas, das wir verwenden.

Es ist ein bisschen grob, aber es erledigt die Aufgabe auf einfache und unkomplizierte Weise. Zumindest, wenn Sie Ihre Lambdas und Mockito kennen.

1voto

Nestor Milyaev Punkte 4616

Eine andere einfache Möglichkeit wäre, eine Log-Anweisung zu bar.someMethod() hinzuzufügen und dann festzustellen, dass Sie die besagte Nachricht sehen können, wenn Ihr Test ausgeführt wird: Wie man eine JUnit-Assert auf eine Nachricht in einem Logger durchführen

Das ist besonders praktisch, wenn Ihre Bar.someMethod() private .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X