Jaka jest różnica pomiędzy @Mock
i @InjectMocks
w ramach Mockito?
java
unit-testing
mocking
mockito
użytkownik2249972
źródło
źródło
Odpowiedzi:
@Mock
tworzy próbkę.@InjectMocks
tworzy instancję klasy i wstrzykuje symulacje utworzone za pomocą@Mock
(lub@Spy
adnotacji ).Pamiętaj, że musisz użyć
@RunWith(MockitoJUnitRunner.class)
lubMockito.initMocks(this)
zainicjować te próby i wstrzyknąć je.źródło
To jest przykładowy kod dotyczący tego, jak
@Mock
i@InjectMocks
działa.Powiedzmy, że mamy
Game
iPlayer
klasę.Jak widzisz,
Game
klasa musiPlayer
wykonaćattack
.Mockito wyśmiewa klasę Gracza, a jej zachowanie za pomocą
when
ithenReturn
metody. Wreszcie, przy użyciu@InjectMocks
Mockito że położyPlayer
sięGame
.Zauważ, że nie musisz nawet tworzyć
new Game
obiektu. Mockito wstrzyknie to dla ciebie.Za pomocą
@Spy
adnotacji otrzymamy to samo zachowanie . Nawet jeśli nazwa atrybutu jest inna.To dlatego, że Mockito sprawdzi
Type Signature
klasę gry, czyliPlayer
iList<String>
.źródło
W klasie testowej testowaną klasę należy opatrzyć adnotacjami
@InjectMocks
. Mówi to Mockito, do której klasy wstrzykiwać próbne:Od tego momentu możemy określić, które konkretne metody lub obiekty w klasie, w tym przypadku
SomeManager
, zostaną zastąpione próbnymi:W tym przykładzie
SomeDependency
wewnątrzSomeManager
klasy będą wyśmiewani.źródło
@Mock
adnotacja wyśmiewa dany obiekt.@InjectMocks
adnotacja pozwala na wstrzyknięcie do obiektu bazowego różnych (i odpowiednich) próbnych stworzonych przez@Mock
.Oba są komplementarne.
źródło
@InjectMocks
stworzeniem tej klasy i szpiegowaniem jej.Na przykład
Tutaj potrzebujemy klasy DAO dla klasy usług. Wyśmiewamy go i wstrzykujemy do instancji klasy usług. Podobnie w systemie Spring wszystkie @Autowired bean mogą być wyśmiewane przez @Mock w jUnits i wstrzykiwane do twojej fasoli przez @InjectMocks.
MockitoAnnotations.initMocks(this)
Metoda inicjuje te symulacje i wstrzykuje je dla każdej metody testowej, dlatego należy ją wywołać wsetUp()
metodzie.Ten link zawiera dobry samouczek dotyczący frameworka Mockito
źródło
„Frameworka frameworka”, na której opiera się Mockito, jest frameworkiem, który daje możliwość tworzenia fałszywych obiektów (dawniej obiekty te można nazwać bocznikami, ponieważ działają one jako boczniki dla funkcji zależnej) Innymi słowy, próbka obiekt służy do naśladowania rzeczywistego obiektu, od którego zależy Twój kod, tworzysz obiekt proxy za pomocą frameworka. Używając próbnych obiektów w testach, zasadniczo przechodzisz od normalnego testowania jednostkowego do testowania integracyjnego
Mockito to otwarta platforma testowa dla Java wydana na licencji MIT, jest to „makieta frameworka”, która pozwala pisać piękne testy z czystym i prostym API. W przestrzeni Java jest wiele różnych fałszywych frameworków, jednak istnieją zasadniczo dwa główne typy fałszywych frameworków obiektowych, zaimplementowane za pośrednictwem proxy i zaimplementowane za pomocą mapowania klas.
Frameworki wstrzykiwania zależności, takie jak Spring, umożliwiają wstrzykiwanie obiektów proxy bez modyfikowania kodu, próbny obiekt oczekuje wywołania określonej metody i zwróci oczekiwany wynik.
@InjectMocks
Adnotacja próbuje instancję testowania obiektów instancji i wstrzykuje pola oznaczone adnotacją z@Mock
lub@Spy
do prywatnych pól obiektu badań.MockitoAnnotations.initMocks(this)
zadzwoń, zresetuj obiekt testowy i ponownie zainicjuj próby, więc pamiętaj, aby mieć to przy sobie@Before
/@BeforeMethod
adnotacji.źródło
Jedną z zalet, które zyskujesz dzięki podejściu wspomnianemu przez @Tom, jest to, że nie musisz tworzyć żadnych konstruktorów w SomeManager, a zatem ograniczać klientów do tworzenia instancji.
To, czy jest to dobra praktyka, zależy od projektu aplikacji.
źródło
Wielu ludzi dały wielką wyjaśnienie tutaj o
@Mock
vs@InjectMocks
. Podoba mi się, ale uważam, że nasze testy i aplikacje powinny być napisane w taki sposób, abyśmy nie musieli ich używać@InjectMocks
.Odniesienia do dalszego czytania z przykładami: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/
źródło
@Mock
służy do deklarowania / kpienia referencji zależnych ziaren, natomiast@InjectMocks
służy do kpienia ziaren, dla których tworzony jest test.Na przykład:
test na klasę
A
:źródło
Adnotacji @InjectMocks można używać do automatycznego wstrzykiwania próbnych pól do obiektu testowego.
W poniższym przykładzie @InjectMocks użył wstrzyknąć próbną dataMap do dataLibrary.
źródło
Zauważ, że
@InjectMocks
wkrótce będą przestarzałei możesz śledzić odpowiedź @avp i link na:
źródło
Mimo że powyższe odpowiedzi obejmują, właśnie próbowałem dodać drobne szczegóły, których brakuje mi. Powód za nimi (Dlaczego).
Ilustracja:
Odniesienie
źródło