תצורת WebAppConfiguration במבחני אביב

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

במאמר זה נחקור את @WebAppConfiguration ביאור באביב, מדוע אנו זקוקים לכך במבחני האינטגרציה שלנו וכיצד נוכל להגדיר זאת כך שבדיקות אלה אכן יתחילו WebApplicationContext.

2. @WebAppConfiguration

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

זה משמש לציון כי ה ApplicationContext אשר מאתחל למבחן צריך להיות מופע של WebApplicationContext.

הערה מהירה לגבי השימוש - בדרך כלל נמצא הערה זו במבחני שילוב מכיוון ש- WebApplicationContext משמש לבניית א MockMvc לְהִתְנַגֵד. תוכל למצוא מידע נוסף על בדיקות שילוב עם אביב כאן.

3. טוען א WebApplicationContext

החל מאביב 3.2, יש כעת תמיכה בהעמסת a WebApplicationContext במבחני שילוב:

@WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) מחלקה ציבורית EmployeeControllerTest {...} 

זה מורה ל TestContext מסגרת שא WebApplicationContext צריך להיות טעון למבחן.

וברקע א MockServletContext נוצר ומסופק למבחנינו WebApplicationContext דרך TestContext מִסגֶרֶת.

3.1. אפשרויות תצורה

כברירת מחדל, נתיב המשאבים הבסיסי עבור ה- WebApplicationContext יוגדר ל "File: src / main / webapp", שהוא מיקום ברירת המחדל עבור שורש ה- WAR בפרויקט Maven.

עם זאת, אנו יכולים לעקוף זאת פשוט על ידי מתן דרך חלופית ל- @WebAppConfiguration ביאור:

@WebAppConfiguration ("src / test / webapp")

אנו יכולים גם להפנות לנתיב משאבים בסיסי משביל הכיתה במקום ממערכת הקבצים:

@WebAppConfiguration ("classpath: test-web-resources")

3.2. מטמון

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

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

4. שימוש @WebAppConfiguration במבחנים

כעת, לאחר שהבנו מדוע עלינו להוסיף את ה- @WebAppConfiguration ביאור בשיעורי המבחן שלנו, בואו נראה מה קורה אם אנחנו מתגעגעים להוסיף אותו כאשר אנו משתמשים ב- WebApplicationContext.

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration הושמט בכוונה @ContextConfiguration (מחלקות = WebConfig.class) EmployeeTest בכיתה ציבורית {@Autowired פרטי WebApplicationContext webAppContext; פרטי MockMvc mockMvc; @ לפני הגדרת הריק הציבורי () {MockitoAnnotations.initMocks (זה); mockMvc = MockMvcBuilders.webAppContextSetup (webAppContext) .build (); } ...}

שימו לב שהערנו את ההערה כדי לדמות את התרחיש בו אנו שוכחים להוסיף אותו. כאן קל להבין מדוע הבדיקה תיכשל כאשר אנו מריצים את מבחן JUnit: אנו מנסים לחווט אוטומטית את WebApplicationContext בשיעור שלא קבענו.

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

בוא נראה:

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration הושמט בכוונה @ContextConfiguration (מחלקות = WebConfig.class) שכבה ציבורית EmployeeTestWithoutMockMvc {@Autowired Private EmployeeController עובדController; ...}

למרות שהדוגמה שלעיל אינה חיווט אוטומטי WebApplicationContext זה עדיין ייכשל מכיוון שהוא מנסה להשתמש בתצורה המותאמת לאינטרנט - WebConfig:

@Configuration @EnableWebMvc @ ComponentScan ("com.baeldung.web") בכיתה ציבורית WebConfig מיישם את WebMvcConfigurer {...}

ההערה @EnableWebMvc הוא האשם כאן - שבעצם ידרוש הקשר האביבי המופעל באינטרנט, ובלעדיו - נראה את המבחן נכשל:

נגרמת על ידי: org.springframework.beans.factory.NoSuchBeanDefinitionException: אין שעועית מזכה מסוג [javax.servlet.ServletContext] שנמצאה לתלות: צפויה לפחות שעועית אחת שמתאימה למועמדת חוט אוטומטי לתלות זו. הערות תלות: {@ org.springframework.beans.factory.annotation.Autowired (חובה = אמת)} ב- osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) ב- osbfsDefaultListableBeanFactory. resolDependency (DefaultListableBeanFactory.java:1014) ב- osbfaAutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement .inject (AutowiredAnnotationBeanPostProcessor.java:545) ... 43 עוד

אז זו הבעיה שאנו מתקנים בקלות על ידי הוספת ה- @WebAppConfiguration ביאור למבחנים שלנו.

5. מסקנה

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

לבסוף, בדקנו את הדוגמאות שלמרות שאם נוסיף את ה- @ContextConfiguration למבחן, זה לא יוכל לעבוד אלא אם נוסיף את ה- @WebAppConfiguration ביאור.

יישום הדוגמאות במאמר זה זמין במאגר שלנו ב- GitHub.


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