Tak więc tworzę próbny obiekt jako zmienną statyczną na poziomie klasy, tak jak ... W jednym teście chcę Foo.someMethod()
zwrócić określoną wartość, podczas gdy w innym teście chcę, aby zwróciła inną wartość. Problem, który mam, polega na tym, że wydaje się, że muszę odbudować symulacje, aby działało poprawnie. Chciałbym uniknąć przebudowy prób i po prostu używać tych samych obiektów w każdym teście.
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.
}
}
W drugim teście nadal otrzymuję 0 jako wartość, gdy wywoływana jest metoda testObj.bar () ... Jaki jest najlepszy sposób na rozwiązanie tego problemu? Zauważ, że wiem, że mógłbym użyć innej makiety Foo
w każdym teście, jednak muszę łączyć wiele żądań mockFoo
, co oznacza, że będę musiał wykonać łańcuch w każdym teście.
test1
i potemtest2
. Być może jednak środowisko ciągłej integracji przeprowadzi testy w innej kolejności. Lub może być tak, że będziesz chciał uruchomićtest2
się sam, bez uruchamianiatest1
najpierw, w takim przypadku zawiedzie. Testy jednostkowe muszą zawsze być od siebie niezależne; i nigdy nie powinna istnieć zależność między poszczególnymi testami ani zależność od określonej kolejności testów. Podczas gdy łańcuchowethenReturn
oświadczenia ...thenReturn
, nie jest to właściwe rozwiązanie w tym konkretnym przypadku. Wydaje mi się, że hordy upvotersów najprawdopodobniej nie zrozumiały pytania.@FixMethodOrder
Dla wszystkich, którzy szukają zwrotu, a następnie innego wyjątku rzucania połączeń:
lub
źródło
Lub nawet czystsze:
źródło
Dla każdego używającego spy () i doReturn () zamiast metody when ():
to, czego potrzebujesz, aby zwrócić inny obiekt przy różnych wywołaniach, to:
.
W przypadku klasycznych makiet:
lub z wyjątkiem zgłoszonego wyjątku:
źródło