Paraméterezett SpringJUnit4ClassRunner használata

1. Áttekintés

Ebben az oktatóanyagban megnézzük, hogyan lehet paraméterezni a JUnit4-ben megvalósított tavaszi integrációs tesztet az a-val Paraméterezett JUnit tesztfutó.

2. SpringJUnit4ClassRunner

SpringJUnit4ClassRunner a JUnit4 megvalósítása ClassRunner hogy beágyazza a tavaszit TestContextManager JUnit tesztbe.

TestContextManager a tavasz belépési pontja TestContext keretrendszert, ezért kezeli a tavaszhoz való hozzáférést ApplicationContext és függőség-injektálás JUnit teszt osztályban. Így, SpringJUnit4ClassRunner lehetővé teszi a fejlesztők számára, hogy integrációs teszteket hajtsanak végre a Spring alkatrészek, például a vezérlők és a tárolók számára.

Például megvalósíthatunk egy integrációs tesztet a sajátunk számára RestController:

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (class = WebConfig.class) public class RoleControllerIntegrationTest {@Autowired private WebApplicationContext wac; privát MockMvc mockMvc; privát statikus végső karakterlánc CONTENT_TYPE = "alkalmazás / szöveg; karakterkészlet = ISO-8859-1"; @A nyilvános érvénytelen beállítás () előtt a (z) kivétel kiveti a {this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } @Test public void givenEmployeeNameJohnWhenInvokeRoleThenReturnAdmin () dobja a Kivételt {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role / John")) .andDo (print ()) .andExpect (MockMvcResultMatchers. andExpect (MockMvcResultMatchers.content (). contentType (CONTENT_TYPE)) .andExpect (MockMvcResultMatchers.content (). string ("ADMIN")); }}

Mint a tesztből kiderül, a mi Vezérlő elfogad egy felhasználói nevet elérési út paraméterként, és ennek megfelelően adja vissza a felhasználói szerepkört.

Most, ennek a REST szolgáltatásnak a felhasználónév / szerepkör kombinációval történő teszteléséhez új tesztet kell végrehajtanunk:

@Test public void givenEmployeeNameDoeWhenInvokeRoleThenReturnEmployee () dobja a Kivételt {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role / Doe")) .andDo (print ()) .andExpect (MockMvcResultMatchers. (MockMvcResultMatchers.content (). ContentType (CONTENT_TYPE)) .andExpect (MockMvcResultMatchers.content (). String ("EMPLOYEE")); }

Ez gyorsan kiszabadulhat olyan szolgáltatásokból, ahol nagyszámú bemeneti kombináció lehetséges.

Hogy elkerüljük ezt a fajta ismétlést tesztóráinkon, nézzük meg, hogyan kell használni Paraméterezett több bemenetet elfogadó JUnit tesztek megvalósításához.

3. Használata Paraméterezett

3.1. Paraméterek meghatározása

Paraméterezett egy egyedi JUnit tesztfutó, amely lehetővé teszi számunkra, hogy egyetlen tesztesetet írjunk és több bemeneti paraméterrel futtassuk:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (class = WebConfig.class) public class RoleControllerParameterizedIntegrationTest {@Parameter (value = 0) public String name; @Parameter (érték = 1) public String szerep; @Parameters public static Gyűjtemény adatai () {Gyűjtemény params = new ArrayList (); params.add (új objektum [] {"John", "ADMIN"}); params.add (új objektum [] {"Doe", "EMPLOYEE"}); visszatérő paramek; } // ...}

Ahogy fentebb bemutattuk, a @Paraméterek kommentár a JUnit tesztbe beadandó bemeneti paraméterek előkészítéséhez. Ezen értékek feltérképezését a @Paraméter mezők név és szerep.

De most egy másik problémát kell megoldanunk - A JUnit nem engedélyez több futót egy JUnit tesztosztályban. Ez azt jelenti, hogy nem tudjuk kihasználni SpringJUnit4ClassRunner beágyazni a TestContextManagerteszt osztályunkba. Meg kell találnunk a beágyazás másik módját TestContextManager.

Szerencsére a Spring néhány lehetőséget kínál ennek elérésére. Ezeket a következő szakaszokban tárgyaljuk.

3.2. A. Inicializálása TestContextManager Manuálisan

Az első lehetőség meglehetősen egyszerű, mivel a Spring lehetővé teszi számunkra az inicializálást TestContextManager manuálisan:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (class = WebConfig.class) public class RoleControllerParameterizedIntegrationTest {@Autowired private WebApplicationContext wac; privát MockMvc mockMvc; privát TestContextManager testContextManager; @A nyilvános void beállítása előtt () a (z) {this.testContextManager = new TestContextManager (getClass ()) kivételt dob; this.testContextManager.prepareTestInstance (this); this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } // ...}

Nevezetesen ebben a példában a Paraméterezett futó helyett SpringJUnit4ClassRunner. Ezután inicializáltuk a TestContextManager ban,-ben beállít() módszer.

Most megvalósíthatjuk a paraméterezett JUnit tesztünket:

@Test public void givenEmployeeNameWhenInvokeRoleThenReturnRole () dobja a Kivételt {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role /" + name)) .andDo (print ()) .andExpect (MockMvcResultMatchers.status. andExpect (MockMvcResultMatchers.content (). contentType (CONTENT_TYPE)) .andExpect (MockMvcResultMatchers.content (). string (szerep)); }

A JUnit ezt a tesztesetet kétszer hajtja végre - egyszer minden bemeneti halmazhoz, amelyet a @Paraméterek annotáció.

3.3. SpringClassRule és SpringMethodRule

Általában, nem ajánlott inicializálni a TestContextManager manuálisan. Ehelyett Spring azt javasolja SpringClassRule és SpringMethodRule.

SpringClassRule megvalósítja a JUnit's-t TestRule - a tesztesetek megírásának alternatív módja. TestRule használható a korábban elvégzett telepítési és tisztítási műveletek helyettesítésére @Előtt, @BeforeClass, @After, és @Óra után mód.

SpringClassRule beágyazza az osztály szintű funkcionalitását TestContextManager JUnit tesztórán. Inicializálja a TestContextManager és felhívja a tavasz beállítását és tisztítását TestContext. Ezért függőségi injekciót és hozzáférést biztosít a ApplicationContext.

Továbbá SpringClassRule, azt is használnunk kell SpringMethodRule. amely biztosítja a példányszintű és a metódus szintű funkcionalitást TestContextManager.

SpringMethodRule felelős a vizsgálati módszerek elkészítéséért. Ezenkívül ellenőrzi az átugrásra kijelölt teszteseteket, és megakadályozza azok futását.

Nézzük meg, hogyan használhatjuk ezt a megközelítést a tesztosztályunkban:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (class = WebConfig.class) public class RoleControllerParameterizedClassRuleIntegrationTest {@ClassRule public static final SpringClassRule scr = new SpringClassRule (); @Rule public final SpringMethodRule smr = new SpringMethodRule (); @A nyilvános érvénytelen beállítás () előtt a (z) kivétel kiveti a {this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } // ...}

4. Következtetés

Ebben a cikkben a tavaszi integrációs tesztek megvalósításának két módját vitattuk meg a Paraméterezett tesztfutó helyett SpringJUnit4ClassRunner. Láttuk, hogyan kell inicializálni TestContextManager manuálisan, és láttunk egy példát a SpringClassRule val vel SpringMethodRule, a Spring által ajánlott megközelítés.

Bár csak a Paraméterezett futó ebben a cikkben, ezeknek a megközelítéseknek bármelyikét alkalmazhatjuk bármely JUnit futóval tavaszi integrációs tesztek megírásához.

Szokás szerint az összes példakód elérhető a GitHubon.