WebAppConfiguration dalam Tes Musim Semi

1. Ikhtisar

Dalam artikel ini, kita akan menjelajahi anotasi @WebAppConfiguration di Spring, mengapa kita membutuhkannya dalam pengujian integrasi dan juga bagaimana kita dapat mengkonfigurasinya sehingga pengujian ini benar-benar mem-bootstrap WebApplicationContext .

2. @WebAppConfiguration

Sederhananya, ini adalah anotasi tingkat kelas yang digunakan untuk membuat versi web dari konteks aplikasi di Spring Framework.

Ini digunakan untuk menunjukkan bahwa ApplicationContext yang di-bootstrap untuk pengujian harus berupa instance WebApplicationContext .

Catatan singkat tentang penggunaan - kami biasanya akan menemukan anotasi ini dalam pengujian integrasi karena WebApplicationContext digunakan untuk membuat objek MockMvc . Anda dapat menemukan informasi lebih lanjut tentang pengujian integrasi dengan Spring di sini.

3. Memuat Konteks WebApplication

Dimulai dengan Spring 3.2, sekarang ada dukungan untuk memuat WebApplicationContext dalam pengujian integrasi:

@WebAppConfiguration @ContextConfiguration(classes = WebConfig.class) public class EmployeeControllerTest { ... } 

Ini menginstruksikan kerangka TestContext bahwa WebApplicationContext harus dimuat untuk pengujian.

Dan, di latar belakang sebuah MockServletContext dibuat dan disuplai ke WebApplicationContext pengujian kami oleh kerangka kerja TestContext .

3.1. Opsi Konfigurasi

Secara default, jalur sumber daya dasar untuk WebApplicationContext akan disetel ke "file: src / main / webapp", yang merupakan lokasi default untuk root WAR di Proyek Maven.

Namun, kita dapat menimpanya hanya dengan menyediakan jalur alternatif ke anotasi @WebAppConfiguration :

@WebAppConfiguration("src/test/webapp")

Kita juga dapat mereferensikan jalur sumber daya dasar dari classpath sebagai ganti dari sistem file:

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

3.2. Caching

Setelah WebApplicationContext dimuat, ini akan di-cache dan digunakan kembali untuk semua pengujian berikutnya yang mendeklarasikan konfigurasi konteks unik yang sama dalam rangkaian pengujian yang sama.

Untuk detail lebih lanjut tentang caching, Anda dapat membaca bagian Context caching dari manual referensi.

4. Menggunakan @WebAppConfiguration dalam Pengujian

Sekarang setelah kita memahami mengapa kita perlu menambahkan anotasi @WebAppConfiguration di kelas pengujian kita, mari kita lihat apa yang terjadi jika kita melewatkan menambahkannya saat kita menggunakan WebApplicationContext .

@RunWith(SpringJUnit4ClassRunner.class) // @WebAppConfiguration omitted on purpose @ContextConfiguration(classes = WebConfig.class) public class EmployeeTest { @Autowired private WebApplicationContext webAppContext; private MockMvc mockMvc; @Before public void setup() { MockitoAnnotations.initMocks(this); mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); } ... }

Perhatikan bahwa kami mengomentari anotasi untuk mensimulasikan skenario di mana kami lupa menambahkannya. Di sini mudah untuk melihat mengapa pengujian akan gagal saat kami menjalankan pengujian JUnit: kami mencoba untuk autowire WebApplicationContext di kelas yang belum kami setel .

Namun, contoh yang lebih umum adalah pengujian yang menggunakan konfigurasi Spring yang mendukung web; itu sebenarnya cukup untuk membuat ujian berhenti.

Mari kita lihat:

@RunWith(SpringJUnit4ClassRunner.class) // @WebAppConfiguration omitted on purpose @ContextConfiguration(classes = WebConfig.class) public class EmployeeTestWithoutMockMvc { @Autowired private EmployeeController employeeController; ... }

Meskipun contoh di atas tidak melakukan autowiring WebApplicationContext, itu masih akan gagal karena mencoba menggunakan konfigurasi yang mendukung web - WebConfig :

@Configuration @EnableWebMvc @ComponentScan("com.baeldung.web") public class WebConfig implements WebMvcConfigurer { ... }

Anotasi @EnableWebMvc adalah penyebabnya di sini - yang pada dasarnya memerlukan konteks Spring yang mendukung web, dan tanpanya - kita akan melihat pengujian gagal:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.servlet.ServletContext] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at o.s.b.f.s.DefaultListableBeanFactory .raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) at o.s.b.f.s.DefaultListableBeanFactory .doResolveDependency(DefaultListableBeanFactory.java:1119) at o.s.b.f.s.DefaultListableBeanFactory .resolveDependency(DefaultListableBeanFactory.java:1014) at o.s.b.f.a.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement .inject(AutowiredAnnotationBeanPostProcessor.java:545) ... 43 more

Jadi itulah masalah yang mudah kami perbaiki dengan menambahkan anotasi @WebAppConfiguration ke pengujian kami.

5. Kesimpulan

Dalam artikel ini kami menunjukkan bagaimana kami dapat membiarkan kerangka kerja TestContext memuat WebApplicationContext ke dalam pengujian integrasi kami hanya dengan menambahkan anotasi.

Terakhir, kami melihat contoh bahwa meskipun kami menambahkan @ ContextConfiguration ke pengujian, ini tidak akan dapat berfungsi kecuali kami menambahkan anotasi @WebAppConfiguration .

Penerapan contoh dalam artikel ini tersedia di repositori kami di GitHub.