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.