שימוש ב- SpringJUnit4ClassRunner עם Parameterized

1. סקירה כללית

במדריך זה נראה כיצד לבצע פרמטר של מבחן אינטגרציה של אביב המיושם ב- JUnit4 עם a פרמטרים רץ למבחן JUnit.

2. SpringJUnit4ClassRunner

SpringJUnit4ClassRunner הוא יישום של JUnit4 ClassRunner זֶה מטביע את האביב TestContextManager לתוך מבחן JUnit.

TestContextManager היא נקודת הכניסה למעיין TestContext מסגרת ולכן מנהל את הגישה לאביב ApplicationContext והזרקת תלות בשיעור בדיקת JUnit. לכן, SpringJUnit4ClassRunner מאפשר למפתחים ליישם מבחני שילוב עבור רכיבי Spring כמו בקרים ומאגרים.

לדוגמא, אנו יכולים ליישם מבחן שילוב עבורנו RestController:

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) מחלקה ציבורית RoleControllerIntegrationTest {@Autowired פרטי WebApplicationContext wac; פרטי MockMvc mockMvc; סופי סטטי פרטי מחרוזת CONTENT_TYPE = "יישום / טקסט; charset = ISO-8859-1"; @ לפני התקנת הריק הציבורי () זורק חריג {this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } @Test הציבור בטל שניתן EmployeeNameJohnWhenInvokeRoleThenReturnAdmin () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role / John")) .andDo (הדפס ()). ו- Expect (MockMvcResultMatchers.). ו-Expect (MockMvcResultMatchers.content (). contentType (CONTENT_TYPE)). andExpect (MockMvcResultMatchers.content (). מחרוזת ("ADMIN")); }}

כפי שניתן לראות מהבדיקה, שלנו בקר מקבל שם משתמש כפרמטר נתיב ומחזיר את תפקיד המשתמש בהתאם.

עַכשָׁיו, על מנת לבדוק שירות REST זה עם שילוב שם משתמש / תפקיד שונה, נצטרך ליישם בדיקה חדשה:

@Test ציבורי בטל givenEmployeeNameDoeWhenInvokeRoleThenReturnEmployee () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role / Doe")) .andDo (הדפס ()). AndExpect (MockMvcResultMatchers.Op. (MockMvcResultMatchers.content (). ContentType (CONTENT_TYPE)). AndExpect (MockMvcResultMatchers.content (). מחרוזת ("EMPLOYEE")); }

זֶה יכול לצאת מיד משליטה לשירותים שבהם מספר רב של שילובי קלט אפשריים.

כדי למנוע חזרה מסוג זה בשיעורי המבחנים שלנו, בואו נראה כיצד להשתמש פרמטרים ליישום מבחני JUnit המקבלים מספר תשומות.

3. שימוש פרמטרים

3.1. הגדרת פרמטרים

פרמטרים הוא רץ בדיקה מותאם אישית של JUnit המאפשר לנו לכתוב מקרה בדיקה יחיד ולפעול מול מספר פרמטרי קלט:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (class = WebConfig.class) מחלקה ציבורית RoleControllerParameterizedIntegrationTest {@Parameter (value = 0) שם מחרוזי ציבורי; @Parameter (value = 1) תפקיד מחרוזת ציבורי; @Parameters נתוני אוסף ציבוריים סטטיים () {Params collection = ArrayList חדש (); params.add (אובייקט חדש [] {"John", "ADMIN"}); params.add (אובייקט חדש [] {"Doe", "EMPLOYEE"}); מסדרים חזרה; } // ...}

כפי שמוצג לעיל, השתמשנו ב- @פרמטרים ביאור להכנת פרמטרי הקלט שיוזרקו למבחן JUnit. סיפקנו גם את מיפוי הערכים הללו ב- @פָּרָמֶטֶר שדות שֵׁם ו תַפְקִיד.

אבל עכשיו, יש לנו בעיה נוספת לפתור - JUnit אינו מאפשר רצים מרובים בכיתת מבחן JUnit אחת. זה אומר אנחנו לא יכולים לנצל SpringJUnit4ClassRunner להטמיע את TestContextManagerלשיעור המבחנים שלנו. נצטרך למצוא דרך אחרת להטמיע TestContextManager.

למרבה המזל, אביב מספק כמה אפשרויות להשיג זאת. נדון בהם בסעיפים הבאים.

3.2. אתחול ה- TestContextManager באופן ידני

האפשרות הראשונה היא די פשוטה, שכן אביב מאפשר לנו לבצע אתחול TestContextManager באופן ידני:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (מחלקות = WebConfig.class) מחלקה ציבורית RoleControllerParameterizedIntegrationTest {@Autowired פרטי WebApplicationContext wac; פרטי MockMvc mockMvc; TestContextManager פרטית testContextManager; @ לפני התקנת הריק הציבורי () זורק חריג {this.testContextManager = TestContextManager חדש (getClass ()); this.testContextManager.prepareTestInstance (זה); this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } // ...}

יש לציין שבדוגמה זו השתמשנו ב- פרמטרים רץ במקום SpringJUnit4ClassRunner. לאחר מכן, אתחזנו את ה- TestContextManager בתוך ה להכין() שיטה.

כעת, אנו יכולים ליישם את מבחן ה- JUnit שעברנו פרמטרים:

@Test ציבורי בטל שניתן EmployeeNameWhenInvokeRoleThenReturnRole () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders .get ("/ role /" + name)). AndDo (הדפס ()) .andExpect (MockMvcResultMatchers.status ().). andExpect (MockMvcResultMatchers.content (). contentType (CONTENT_TYPE)). andExpect (MockMvcResultMatchers.content (). מחרוזת (תפקיד)); }

JUnit תבצע את מקרה הבדיקה פעמיים - פעם אחת לכל קבוצת תשומות שהגדרנו באמצעות ה- @פרמטרים ביאור.

3.3. SpringClassRule ו SpringMethodRule

בדרך כלל, לא מומלץ לאתחל את TestContextManager באופן ידני. במקום זאת, אביב ממליץ להשתמש SpringClassRule ו SpringMethodRule.

SpringClassRule מיישם את JUnit TestRule - דרך חלופית לכתוב מקרי מבחן. TestRule ניתן להשתמש כדי להחליף את פעולות ההתקנה והניקוי שנעשו בעבר @לפני, @BeforeClass, @ לאחר, ו @אחרי השיעור שיטות.

SpringClassRule מטמיע פונקציונליות ברמת הכיתה של TestContextManager בשיעור מבחן JUnit. זה מאותחל את TestContextManager ומזמין את ההתקנה והניקוי של האביב TestContext. לכן, הוא מספק הזרקת תלות וגישה ל ApplicationContext.

בנוסף ל SpringClassRule, עלינו להשתמש גם SpringMethodRule. המספק את הפונקציונליות ברמת המופע וברמת השיטה עבור TestContextManager.

SpringMethodRule אחראי על הכנת שיטות הבדיקה. זה גם בודק אם קיימים מקרי בדיקה המסומנים לדילוג ומונע מהם לרוץ.

בואו נראה כיצד להשתמש בגישה זו בשיעור הבדיקה שלנו:

@RunWith (Parameterized.class) @WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) class public RoleControllerParameterizedClassRuleIntegrationTest {@ClassRule public static final SpringClassRule scr = new SpringClassRule (); גמר ציבורי @Rule SpringMethodRule smr = SpringMethodRule חדש (); @ לפני התקנת הריק הציבורי () זורק חריג {this.mockMvc = MockMvcBuilders.webAppContextSetup (this.wac) .build (); } // ...}

4. מסקנה

במאמר זה דנו בשתי דרכים ליישום מבחני שילוב אביב באמצעות ה- פרמטרים רץ למבחן במקום SpringJUnit4ClassRunner. ראינו כיצד לאתחל TestContextManager ידנית, וראינו דוגמה באמצעות SpringClassRule עם SpringMethodRule, הגישה המומלצת על ידי אביב.

למרות שדנו רק ב פרמטרים רץ במאמר זה, אנו יכולים להשתמש באחת הגישות הללו עם כל רץ של JUnit לכתוב מבחני שילוב אביב.

כרגיל, כל קוד הדוגמה זמין ב- GitHub.


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