Also erstelle ich ein Scheinobjekt als statische Variable auf Klassenebene wie folgt ... In einem Test möchte ich Foo.someMethod()
einen bestimmten Wert zurückgeben, während ich in einem anderen Test möchte, dass es einen anderen Wert zurückgibt. Das Problem, das ich habe, ist, dass ich anscheinend die Mocks neu erstellen muss, damit dies richtig funktioniert. Ich möchte vermeiden, die Mocks neu zu erstellen, und in jedem Test dieselben Objekte verwenden.
class TestClass {
private static Foo mockFoo;
@BeforeClass
public static void setUp() {
mockFoo = mock(Foo.class);
}
@Test
public void test1() {
when(mockFoo.someMethod()).thenReturn(0);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value
}
@Test
public void test2() {
when(mockFoo.someMethod()).thenReturn(1);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.
}
}
Im zweiten Test erhalte ich immer noch 0 als Wert, wenn testObj.bar () aufgerufen wird ... Wie kann dies am besten behoben werden? Beachten Sie, dass ich weiß, dass ich Foo
in jedem Test ein anderes Modell verwenden kann. Ich muss jedoch mehrere Anforderungen mockFoo
verketten, was bedeutet, dass ich die Verkettung in jedem Test durchführen muss.
test1
und danntest2
. Es kann jedoch sein, dass Ihre Umgebung für die kontinuierliche Integration die Tests in der anderen Reihenfolge ausführt. Oder es kann sein, dass Sietest2
selbst ausführen möchten , ohnetest1
zuerst ausgeführt zu werden. In diesem Fall schlägt dies fehl. Unit Tests müssen immer unabhängig voneinander sein; und es sollte niemals eine Abhängigkeit zwischen einzelnen Tests oder eine Abhängigkeit von einer bestimmten Reihenfolge von Tests geben. Während VerkettungthenReturn
Aussagen ...thenReturn
, es ist in diesem speziellen Fall keine richtige Lösung. Es scheint mir, dass die Horden von Aufsteigern hier die Frage höchstwahrscheinlich nicht verstanden haben.@FixMethodOrder
Für alle, die suchen, um etwas zurückzugeben, und dann für eine andere Call-Throw-Ausnahme:
oder
quelle
Oder noch sauberer:
quelle
Für alle, die spy () und doReturn () anstelle der when () -Methode verwenden:
Was Sie benötigen, um bei verschiedenen Aufrufen unterschiedliche Objekte zurückzugeben, ist Folgendes:
.
Für klassische Mocks:
oder mit einer Ausnahme, die geworfen wird:
quelle