Injekčné vysmievanie sa vysmievaním do jarných bôbov

1. Prehľad

V tomto článku si ukážeme, ako používať injekciu závislostí na vloženie makiet Mockito do Spring Beans na jednotkové testovanie.

V aplikáciách v reálnom svete, kde súčasti často závisia od prístupu k externým systémom, je dôležité zabezpečiť správnu izoláciu testu, aby sme sa mohli zamerať na testovanie funkčnosti danej jednotky bez toho, aby sme pre každý test museli zapojiť celú hierarchiu tried.

Injekcia falošnej injekcie je čistý spôsob zavedenia takejto izolácie.

2. Maven závislosti

Pre jednotkové testy a falošné objekty potrebujeme nasledujúce závislosti Maven:

 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 

Pre tento príklad sme sa rozhodli použiť Spring Boot, ale klasický Spring bude tiež fungovať dobre.

3. Písanie testu

3.1. Obchodná logika

Najprv si vytvorme jednoduchú službu, ktorú budeme testovať:

@ Verejná trieda služieb NameService {public String getUserName (String id) {return "Skutočné meno používateľa"; }}

A vstreknite ho do UserService trieda:

@ Verejná trieda služieb UserService {private NameService nameService; @Autowired public UserService (NameService nameService) {this.nameService = nameService; } public String getUserName (String id) {návrat nameService.getUserName (id); }}

Pre tento tutoriál vrátia dané triedy jedno meno bez ohľadu na poskytnuté ID. Robíme to tak, aby sme sa nenechali rozptýliť testovaním akejkoľvek zložitej logiky.

Budeme tiež potrebovať štandardnú hlavnú triedu Spring Boot na skenovanie fazule a inicializáciu aplikácie:

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

3.2. Skúšky

Teraz prejdime k testovacej logike. Najskôr musíme nakonfigurovať kontext aplikácie pre testy:

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

The @Profil anotácia informuje Spring, aby použila túto konfiguráciu iba vtedy, keď je aktívny profil „test“. The @Primárny anotácia je tu preto, aby ste sa uistili, že táto inštancia je použitá namiesto skutočnej na automatické zapojenie. Samotná metóda vytvorí a vráti náš Mockito výsmech NameService trieda.

Teraz môžeme napísať test jednotky:

@ActiveProfiles ("test") @RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = MocksApplication.class) verejná trieda UserServiceUnitTest {@Autowired private UserService userService; @Autowired private NameService nameService; @Test public void whenUserIdIsProvided_thenRetrievedNameIsCorrect () {Mockito.when (nameService.getUserName ("SomeId")). ThenReturn ("Mock meno používateľa"); Reťazec testName = userService.getUserName ("SomeId"); Assert.assertEquals ("Mock meno používateľa", testName); }}

Používame @ActiveProfiles anotácia, aby ste povolili „testovací“ profil a aktivovali simulovanú konfiguráciu, ktorú sme napísali skôr. Z tohto dôvodu Spring automaticky dáva skutočnú inštanciu súboru UserService triedy, ale predstieraný NameService trieda. Samotný test je pomerne typickým testom JUnit + Mockito. Nakonfigurujeme požadované správanie simulácie, potom zavoláme metódu, ktorú chceme otestovať, a tvrdíme, že vráti hodnotu, ktorú očakávame.

Je tiež možné (aj keď sa to neodporúča) vyhnúť sa používaniu profilov prostredia v takýchto testoch. Ak to chcete urobiť, odstráňte @Profile a @ActiveProfiles anotácie a pridať @ContextConfiguration (triedy = NameServiceTestConfiguration.class) anotácia k UserServiceTest trieda.

4. Záver

V tomto rýchlom výučbe sme si ukázali, aké ľahké je injektovať mockitové makety do Spring Beans.

Ako obvykle sú všetky ukážky kódu k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found