Korištenje SpringJUnit4ClassRunner s parametriziranim

1. Pregled

U ovom uputstvu vidjet ćemo kako parameterizirati test integracije proljeća implementiran u JUnit4 pomoću a Parametarizirano JUnit test trkač.

2. SpringJUnit4ClassRunner

SpringJUnit4ClassRunner je implementacija JUnit4-a ClassRunner da ugrađuje Spring's TestContextManager u JUnit test.

TestContextManager je ulazna točka u Proljeće TestContext okvira i stoga upravlja pristupom Proljeću ApplicationContext i ubrizgavanje ovisnosti u JUnit test klasi. Tako, SpringJUnit4ClassRunner omogućuje programerima da implementiraju integracijske testove za Spring komponente poput kontrolera i spremišta.

Na primjer, možemo provesti test integracije za naš RestController:

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) javna klasa RoleControllerIntegrationTest {@Autowired private WebApplicationContext wac; privatni MockMvc mockMvc; privatni statički završni niz CONTENT_TYPE = "aplikacija / tekst; charset = ISO-8859-1"; @Prije javnog void postavljanja () baca iznimku {this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } @Test javna praznina givenEfficieeNameJohnWhenInvokeRoleThenReturnAdmin () baca izuzetak {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role / John")). AndDo (print ()) .andExpect (MockMvcRusult). andExpect (MockMvcResultMatchers.content (). contentType (CONTENT_TYPE)) .andExpect (MockMvcResultMatchers.content (). string ("ADMIN")); }}

Kao što se vidi iz testa, naš Kontroler prihvaća korisničko ime kao parametar puta i u skladu s tim vraća korisničku ulogu.

Sada, da bismo testirali ovu REST uslugu s drugom kombinacijom korisničkog imena / uloge, morali bismo implementirati novi test:

@Test public void givenEfficieeNameDoeWhenInvokeRoleThenReturnEfficiee () baca izuzetak {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role / Doe")). AndDo (print ()) .andExpect (MockMvcs. (MockMvcResultMatchers.content (). ContentType (CONTENT_TYPE)) .andExpect (MockMvcResultMatchers.content (). String ("EMPLOYEE")); }

Ovaj mogu brzo izmaknuti kontroli za usluge u kojima je moguć veliki broj kombinacija unosa.

Da bismo izbjegli ovu vrstu ponavljanja u našim testnim tečajevima, pogledajmo kako se koristiti Parametarizirano za provedbu JUnit testova koji prihvaćaju više ulaza.

3. Korištenje Parametarizirano

3.1. Definiranje parametara

Parametarizirano je prilagođeni JUnit testni pokretač koji nam omogućuje da napišemo jedan testni slučaj i pokrenemo ga protiv više ulaznih parametara:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) javna klasa RoleControllerParameterizedIntegrationTest {@Parameter (value = 0) naziv javnog niza; @Parameter (value = 1) javna uloga niza; @Parameters public static Collection data () {Params zbirke = new ArrayList (); params.add (novi objekt [] {"John", "ADMIN"}); params.add (novi objekt [] {"Doe", "EMPLOYEE"}); povratni parametri; } // ...}

Kao što je gore prikazano, koristili smo @Parameters napomena za pripremu ulaznih parametara za ubrizgavanje u test JUnit. Također smo pružili mapiranje tih vrijednosti u @Parametar polja Ime i uloga.

Ali sada moramo riješiti još jedan problem - JUnit ne dopušta više trkača u jednoj JUnit test klasi. To znači ne možemo iskoristiti SpringJUnit4ClassRunner za ugrađivanje TestContextManageru naš testni razred. Morat ćemo pronaći drugi način za ugrađivanje TestContextManager.

Srećom, Spring nudi nekoliko mogućnosti za postizanje ovoga. O njima ćemo raspravljati u sljedećim odjeljcima.

3.2. Inicijalizacija TestContextManager Ručno

Prva je opcija prilično jednostavna, jer nam Spring omogućuje inicijalizaciju TestContextManager ručno:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) javna klasa RoleControllerParameterizedIntegrationTest {@Autowired private WebApplicationContext wac; privatni MockMvc mockMvc; private TestContextManager testContextManager; @Prije javne void setup () baca iznimku {this.testContextManager = new TestContextManager (getClass ()); this.testContextManager.prepareTestInstance (this); this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } // ...}

Značajno je da smo u ovom primjeru koristili Parametarizirano trkač umjesto SpringJUnit4ClassRunner. Dalje smo inicijalizirali TestContextManager u postaviti() metoda.

Sada možemo implementirati naš parametarski test JUnit:

@Test public void givenEfficieeNameWhenInvokeRoleThenReturnRole () baca izuzetak {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role /" + name)). AndDo (print ()) .andExpect (MockMvcResultMatchers.k) andExpect (MockMvcResultMatchers.content (). contentType (CONTENT_TYPE)) .andExpect (MockMvcResultMatchers.content (). string (role)); }

JUnit će ovaj test izvršiti dva puta - jednom za svaki skup ulaza koji smo definirali pomoću @Parameters bilješka.

3.3. SpringClassRule i SpringMethodRule

Općenito, nije preporučljivo inicijalizirati TestContextManager ručno. Umjesto toga, Spring preporučuje upotrebu SpringClassRule i SpringMethodRule.

SpringClassRule provodi JUnit-ove TestRule - zamjenski način pisanja test slučajeva. TestRule može se koristiti za zamjenu postupaka postavljanja i čišćenja koji su prethodno obavljeni @Prije, @BeforeClass, @After, i @Nakon nastave metode.

SpringClassRule ugrađuje funkcionalnost na razini klase TestContextManager u tečaju JUnit testa. Inicijalizira TestContextManager i poziva postavljanje i čišćenje proljeća TestContext. Stoga pruža ubrizgavanje ovisnosti i pristup ApplicationContext.

Pored SpringClassRule, također moramo koristiti SpringMethodRule. koji pruža funkcionalnost na razini instance i na razini metode za TestContextManager.

SpringMethodRule odgovoran je za pripremu metoda ispitivanja. Također provjerava test slučajeve koji su označeni za preskakanje i sprječava njihovo pokretanje.

Pogledajmo kako koristiti ovaj pristup u našoj testnoj klasi:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) javna klasa RoleControllerParameterizedClassRuleIntegrationTest {@ClassRule public static final SpringClassRule scr = new SpringClassRule (); @Rule public final SpringMethodRule smr = new SpringMethodRule (); @Prije javnog void postavljanja () baca iznimku {this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } // ...}

4. Zaključak

U ovom smo članku razgovarali o dva načina provođenja proljetnih integracijskih testova pomoću Parametarizirano test trkač umjesto SpringJUnit4ClassRunner. Vidjeli smo kako se inicijalizira TestContextManager ručno i vidjeli smo primjer korištenja SpringClassRule s SpringMethodRule, pristup koji preporučuje Proljeće.

Iako smo razgovarali samo o Parametarizirano trkač u ovom članku, zapravo možemo koristiti bilo koji od ovih pristupa s bilo kojim JUnit trkačem za pisanje proljetnih integracijskih testova.

Kao i obično, sav primjer koda dostupan je na GitHubu.