Używam Mockito @Mock
i @InjectMocks
adnotacji do wstrzykiwania zależności do prywatnych pól, które są opatrzone adnotacjami za pomocą Springa @Autowired
:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Mock
private SomeService service;
@InjectMocks
private Demo demo;
/* ... */
}
i
public class Demo {
@Autowired
private SomeService service;
/* ... */
}
Teraz chciałbym również wstrzykiwać prawdziwe obiekty do prywatnych @Autowired
pól (bez ustawiaczy). Czy to możliwe, czy mechanizm ogranicza się tylko do wstrzykiwania próbnych prób?
MockitoAnnotations.initMocks(this);
o@Before
metodzie. Wiem, że nie jest to bezpośrednio związane z pierwotnym pytaniem, ale dla każdego, kto przyjdzie później, należy to dodać, aby to uruchomić.@RunWith(MockitoJUnitRunner.class)
), nie potrzebujesz liniiMockitoAnnotations.initMocks(this);
Odpowiedzi:
Użyj
@Spy
adnotacjiMockito weźmie pod uwagę wszystkie pola posiadające
@Mock
lub@Spy
adnotacje jako potencjalnych kandydatów do wstrzyknięcia do instancji opatrzone@InjectMocks
adnotacją. W powyższym przypadku'RealServiceImpl'
instancja zostanie wstrzyknięta do „wersji demo”Aby uzyskać więcej informacji, patrz
Mockito-home
@Szpieg
@Drwić
źródło
Mockito cannot mock/spy following: - final classes - anonymous classes - primitive types
new RealServiceImpl()
,@Spy private SomeService service;
tworzy prawdziwy obiekt za pomocą domyślnego konstruktora przed szpiegowaniem go.Oprócz odpowiedzi @Dev Blanked, jeśli chcesz użyć istniejącej fasoli utworzonej przez Spring, kod można zmodyfikować do:
W ten sposób nie musisz zmieniać kodu (dodawać innego konstruktora), aby testy działały.
źródło
Autowired
pola z zależności zostały poprawnie utworzone.Mockito nie jest szkieletem DI, a nawet szkielety DI zachęcają do iniekcji konstruktora w porównaniu do iniekcji w terenie.
Dlatego deklarujesz konstruktor, aby ustawić zależności testowanej klasy:
Używanie Mockito
spy
w ogólnej sprawie jest straszną wskazówką . Sprawia, że klasa testowa jest krucha, a nie prosta i podatna na błędy: co tak naprawdę jest wyśmiewane? Co naprawdę jest testowane?@InjectMocks
a@Spy
także szkodzi ogólnemu projektowi, ponieważ zachęca rozdęte klasy i mieszane obowiązki w klasach.Proszę przeczytać
spy()
javadoc przed użyciem go na ślepo (nacisk nie jest mój):źródło
Na wiosnę istnieje specjalne narzędzie zwane
ReflectionTestUtils
do tego celu. Weź konkretną instancję i wstrzyknij w pole.źródło
Wiem, że to stare pytanie, ale napotkaliśmy ten sam problem, próbując wstrzyknąć Strings. Wynaleźliśmy więc rozszerzenie JUnit5 / Mockito, które robi dokładnie to, co chcesz: https://github.com/exabrial/mockito-object-injection
EDYTOWAĆ:
źródło