Mam prywatną metodę w mojej klasie testowej, która konstruuje często używany Bar
obiekt. Bar
Konstruktor wywołuje someMethod()
metodę w moim wyśmiewali obiektu:
private @Mock Foo mockedObject; // My mocked object
...
private Bar getBar() {
Bar result = new Bar(mockedObject); // this calls mockedObject.someMethod()
}
W niektórych moich metodach testowych, które chcę sprawdzić, someMethod
został również wywołany przez ten konkretny test. Coś w stylu:
@Test
public void someTest() {
Bar bar = getBar();
// do some things
verify(mockedObject).someMethod(); // <--- will fail
}
To się nie udaje, ponieważ wyśmiewany obiekt someMethod
wywołał się dwukrotnie. Nie chcę, aby moje metody testowe przejmowały się skutkami ubocznymi mojej getBar()
metody, więc czy uzasadnione byłoby zresetowanie mojego próbnego obiektu na końcu getBar()
?
private Bar getBar() {
Bar result = new Bar(mockedObject); // this calls mockedObject.someMethod()
reset(mockedObject); // <-- is this OK?
}
Pytam, ponieważ dokumentacja sugeruje, że resetowanie fałszywych obiektów ogólnie wskazuje na złe testy. Jednak wydaje mi się to w porządku.
Alternatywny
Wydaje się, że alternatywnym wyborem jest wołanie:
verify(mockedObject, times(2)).someMethod();
co moim zdaniem zmusza każdy test do poznania oczekiwań getBar()
, bez żadnego zysku.