Jestem nowy w Mockito.
Biorąc pod uwagę poniższą klasę, jak mogę użyć Mockito, aby sprawdzić, czy wywołano someMethod
dokładnie raz po foo
wywołaniu?
public class Foo
{
public void foo(){
Bar bar = new Bar();
bar.someMethod();
}
}
Chciałbym wykonać następujące połączenie weryfikacyjne,
verify(bar, times(1)).someMethod();
gdzie bar
jest kpina z Bar
.
Odpowiedzi:
Wstrzykiwanie zależności
Jeśli wstrzykujesz instancję Bar lub fabrykę używaną do tworzenia instancji Bar (lub jeden z 483 innych sposobów na zrobienie tego), będziesz mieć dostęp niezbędny do przeprowadzenia testu.
Przykład fabryki:
Biorąc pod uwagę klasę Foo napisaną w ten sposób:
w metodzie testowej możesz wstrzyknąć BarFactory w następujący sposób:
Bonus: jest to przykład tego, jak TDD może sterować projektem twojego kodu.
źródło
Bar bar = mock(Bar.class)
zamiastBar bar = new Bar();
BarFactory myFactory = mock(BarFactory.class); when(myFactory.createBar()).thenReturn(bar);
Klasyczna odpowiedź brzmi: „Ty nie”. Testujesz publiczny interfejs API
Foo
, a nie jego elementy wewnętrzne.Czy
Foo
ma na to wpływ jakieś zachowanie obiektu (lub, co gorsza, jakiś inny obiekt w środowisku)foo()
? Jeśli tak, sprawdź to. A jeśli nie, co robi metoda?źródło
Foo
topublic void foo()
, gdzie elementy wewnętrzne są powiązane tylko z paskiem.verify()
się bardzo pomocny, nawet jeśli nie czcisz już świętego ołtarza prób integracyjnych.Jeśli nie chcesz używać DI lub fabryk. Możesz refaktoryzować swoją klasę w nieco trudny sposób:
A twoja klasa testowa:
Następnie klasa, która wywołuje twoją metodę foo, zrobi to w następujący sposób:
Jak widać podczas wywoływania metody w ten sposób, nie trzeba importować klasy Bar do żadnej innej klasy, która wywołuje metodę foo, co może być czymś, czego chcesz.
Oczywiście wadą jest to, że pozwalasz dzwoniącemu na ustawienie obiektu Bar.
Mam nadzieję, że to pomoże.
źródło
Rozwiązanie dla twojego przykładowego kodu za pomocą
PowerMockito.whenNew
FooTest.java
Wyjście JUnit
źródło
Myślę, że Mockito
@InjectMocks
jest właściwą drogą.W zależności od intencji możesz użyć:
Więcej informacji w dokumentach
Poniżej znajduje się przykład z iniekcją polową:
Klasy:
Test:
źródło
Tak, jeśli naprawdę chcesz / musisz to zrobić, możesz użyć PowerMock. Należy to uznać za ostateczność. Dzięki PowerMock możesz spowodować, że zwróci próbkę z wywołania do konstruktora. Następnie wykonaj weryfikację na próbnym. To powiedziawszy, odpowiedź csturtza jest „właściwa”.
Oto link do fałszywej konstrukcji nowych obiektów
źródło
Innym prostym sposobem byłoby dodanie instrukcji dziennika do bar.someMethod (), a następnie upewnienie się, że widzisz wspomniany komunikat po wykonaniu testu, zobacz przykłady tutaj: Jak wykonać JUnit w komunikacie w loggerze
Jest to szczególnie przydatne, gdy używana jest funkcja Bar.someMethod ()
private
.źródło