Ubrizgavanje Mockito podsmijeha u proljetni grah

1. Pregled

U ovom ćemo članku pokazati kako koristiti injekciju ovisnosti za umetanje Mockito mockova u Spring Beans za jedinstveno testiranje.

U stvarnim aplikacijama, gdje komponente često ovise o pristupu vanjskim sustavima, važno je osigurati odgovarajuću izolaciju testa kako bismo se mogli usredotočiti na testiranje funkcionalnosti određene jedinice bez potrebe za uključivanjem cijele hijerarhije klasa za svaki test.

Ubrizgavanje lažne slike čisti je način za uvođenje takve izolacije.

2. Ovisnosti Mavena

Trebamo sljedeće Mavenove ovisnosti za jedinične testove i lažne objekte:

 org.springframework.boot spring-boot-starter 2.2.2.RELEASE org.springframework.boot spring-boot-starter-test 2.2.2.RELEASE test org.mockito mockito-core 2.21.0 

Odlučili smo koristiti Spring Boot za ovaj primjer, ali klasični Spring također će dobro funkcionirati.

3. Pisanje testa

3.1. Poslovna logika

Prvo, izradimo jednostavnu uslugu koju ćemo testirati:

@Service javna klasa NameService {javni niz getUserName (ID niza) {return "Pravo korisničko ime"; }}

I ubrizgajte ga u Korisnička usluga razred:

@Service javna klasa UserService {private NameService nameService; @Autowired javna korisnička usluga (NameService nameService) {this.nameService = nameService; } javni String getUserName (ID niza) {return nameService.getUserName (id); }}

Za ovaj tutorial zadani razredi vraćaju jedno ime bez obzira na navedeni ID. To je učinjeno kako ne bismo ometali testiranje bilo koje složene logike.

Također će nam trebati standardna glavna klasa Spring Boot za skeniranje graha i inicijalizaciju aplikacije:

@SpringBootApplication javna klasa MocksApplication {public static void main (String [] args) {SpringApplication.run (MocksApplication.class, args); }}

3.2. Ispitivanja

Sada prijeđimo na testnu logiku. Prije svega, moramo konfigurirati kontekst aplikacije za testove:

@Profile ("test") @Configuration javna klasa NameServiceTestConfiguration {@Bean @Primary public NameService nameService () {return Mockito.mock (NameService.class); }}

The @Profil napomena govori Springu da primijeni ovu konfiguraciju samo kada je aktivan profil "test". The @ Primarno napomena postoji kako bi se osiguralo da se ova instanca koristi umjesto stvarne za automatsko povezivanje. Sama metoda stvara i vraća Mockito podsmijeh našeg NameService razred.

Sada možemo napisati jedinični test:

@ActiveProfiles ("test") @RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = MocksApplication.class) javna klasa UserServiceUnitTest {@Autowired private UserService userService; @Autowired private NameService nameService; @Test public void whenUserIdIsProvided_thenRetrievedNameIsCorrect () {Mockito.when (nameService.getUserName ("SomeId")). ThenReturn ("Lažno korisničko ime"); Niz testName = userService.getUserName ("SomeId"); Assert.assertEquals ("Lažno korisničko ime", testName); }}

Koristimo @ActiveProfiles napomena kako bi se omogućio profil "test" i aktivirala lažna konfiguracija koju smo ranije napisali. Zbog toga Spring provodi stvarnu instancu Korisnička usluga klase, ali izrugivanje NameService razred. Sam test prilično je tipičan JUnit + Mockito test. Konfiguriramo željeno ponašanje lažne slike, zatim pozivamo metodu koju želimo testirati i tvrdimo da vraća vrijednost koju očekujemo.

Također je moguće (iako se ne preporučuje) izbjeći upotrebu profila okoline u takvim testovima. Da biste to učinili, uklonite @Profile i @ActiveProfiles bilješke i dodajte znak @ContextConfiguration (klase = NameServiceTestConfiguration.class) bilješka na UserServiceTest razred.

4. Zaključak

U ovom smo brzom uputstvu pokazali kako je lako ubrizgati Mockito mockove u proljetni grah.

Kao i obično, svi uzorci koda dostupni su na GitHubu.