Mockito gúnyok injektálása a tavaszi babba
1. Áttekintés
Ebben a cikkben bemutatjuk, hogyan lehet a függőségi injekciót használni a Mockito gúnyok beillesztésére a Spring Beans-ba az egység teszteléséhez.
A valós alkalmazásokban, ahol az összetevők gyakran a külső rendszerek elérésétől függenek, fontos a megfelelő tesztelkülönítés biztosítása, hogy az adott egység funkcionalitásának tesztelésére összpontosíthassunk anélkül, hogy az egyes tesztekhez a teljes osztályhierarchiát kellene bevonnunk.
Az ál beadása tiszta módszer az ilyen elszigeteltség bevezetésére.
2. Maven-függőségek
A következő Maven-függőségekre van szükségünk az egységtesztekhez és az álobjektumokhoz:
org.springframework.boot spring-boot-starter 2.2.2.RELEASE org.springframework.boot spring-boot-starter-test 2.2.2.RELEASE teszt org.mockito mockito-core 2.21.0
Úgy döntöttünk, hogy a Spring Boot alkalmazást használjuk erre a példára, de a klasszikus Spring is jól fog működni.
3. A teszt megírása
3.1. Az üzleti logika
Először hozzunk létre egy egyszerű szolgáltatást, amelyet tesztelni fogunk:
@Service public class NameService {public String getUserName (String id) {return "Valódi felhasználónév"; }}
És fecskendezze be a UserService osztály:
@Service public class UserService {private NameService nameService; @Autowired public UserService (NameService nameService) {this.nameService = névSzolgáltatás; } public String getUserName (String id) {return nameService.getUserName (id); }}
Ehhez az oktatóanyaghoz az adott osztályok egyetlen nevet adnak vissza, függetlenül a megadott azonosítótól. Ez azért történik, hogy ne zavarjanak minket a komplex logikák tesztelése.
Szükségünk lesz egy standard Spring Boot főosztályra is a bab beolvasásához és az alkalmazás inicializálásához:
@SpringBootApplication public class MocksApplication {public static void main (String [] args) {SpringApplication.run (MocksApplication.class, args); }}
3.2. A tesztek
Most térjünk át a tesztlogikára. Először is konfigurálnunk kell az alkalmazás környezetét a tesztekhez:
@Profile ("test") @Configuration public class NameServiceTestConfiguration {@Bean @Primary public NameService nameService () {return Mockito.mock (NameService.class); }}
A @Profil az annotáció azt mondja Springnek, hogy csak akkor használja ezt a konfigurációt, ha a „teszt” profil aktív. A @Elsődleges az annotáció azért van, hogy megbizonyosodjon arról, hogy ezt a példányt használják a valódi helyett az automatikus vezetéshez. Maga a módszer létrehozza és visszaadja egy Mockito-gúnyt NameService osztály.
Most megírhatjuk az egység tesztet:
@ActiveProfiles ("teszt") @RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (class = MocksApplication.class) public class UserServiceUnitTest {@Autowired private UserService userService; @Autowired private NameService nameService; @Test public void whenUserIdIsProvided_thenRetrievedNameIsCorrect () {Mockito.when (nameService.getUserName ("SomeId")). ThenReturn ("Mock user name"); Karakterlánc tesztnév = userService.getUserName ("SomeId"); Assert.assertEquals ("Modell felhasználónév", tesztNév); }}
Használjuk a @ActiveProfiles annotáció a „teszt” profil engedélyezéséhez és az előbb írt álkonfiguráció aktiválásához. Emiatt Spring automatikusan bekapcsolja a UserService osztály, de a NameService osztály. Maga a teszt meglehetősen tipikus JUnit + Mockito teszt. Konfiguráljuk az ál kívánt viselkedését, majd meghívjuk a tesztelni kívánt módszert, és állítjuk, hogy az adja vissza az elvárt értéket.
Az is lehetséges (bár nem ajánlott), hogy elkerülje a környezeti profilok használatát az ilyen tesztekben. Ehhez távolítsa el a @Profile és @ActiveProfiles megjegyzéseket és adjon hozzá egy @ContextConfiguration (osztályok = NameServiceTestConfiguration.class) jegyzet a UserServiceTest osztály.
4. Következtetés
Ebben a gyors bemutatóban megmutattuk, milyen egyszerű a Mockito gúnyokat beadni a tavaszi babba.
Szokás szerint az összes kódminta elérhető a GitHubon.