WebAppConfiguration in Spring Tests

1. Gambaran keseluruhan

Dalam artikel ini, kami akan menerangkan anotasi @WebAppConfiguration pada musim bunga, mengapa kami memerlukannya dalam ujian integrasi kami dan juga bagaimana kami dapat mengkonfigurasinya sehingga ujian ini benar-benar menguatkan WebApplicationContext .

2. @WebAppConfiguration

Ringkasnya, ini adalah anotasi peringkat kelas yang digunakan untuk membuat versi web dari konteks aplikasi dalam Spring Framework.

Ini digunakan untuk menunjukkan bahawa ApplicationContext yang di-boot untuk ujian harus merupakan contoh WebApplicationContext .

Catatan ringkas mengenai penggunaan - biasanya kita akan mendapat penjelasan ini dalam ujian integrasi kerana WebApplicationContext digunakan untuk membina objek MockMvc . Anda boleh mendapatkan lebih banyak maklumat mengenai ujian integrasi dengan Spring di sini.

3. Memuatkan WebApplicationContext

Bermula dengan Spring 3.2, kini ada sokongan untuk memuat WebApplicationContext dalam ujian integrasi:

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

Ini mengarahkan TestContext rangka kerja bahawa WebApplicationContext perlu dimuatkan untuk ujian.

Dan, di latar belakang yang MockServletContext dicipta dan dibekalkan kepada ujian kita WebApplicationContext oleh TestContext rangka kerja.

3.1. Pilihan Konfigurasi

Secara lalai, jalur sumber asas untuk WebApplicationContext akan ditetapkan ke "file: src / main / webapp", yang merupakan lokasi lalai untuk root WAR dalam Maven Project.

Walau bagaimanapun, kami dapat mengatasi ini dengan hanya memberikan jalan alternatif ke anotasi @WebAppConfiguration :

@WebAppConfiguration("src/test/webapp")

Kita juga boleh merujuk jalan sumber asas dari classpath dan bukannya sistem fail:

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

3.2. Caching

Setelah WebApplicationContext dimuat, ia akan di-cache dan digunakan kembali untuk semua ujian seterusnya yang menyatakan konfigurasi konteks unik yang sama dalam rangkaian ujian yang sama.

Untuk keterangan lebih lanjut mengenai caching, anda boleh melihat bahagian Konteks caching pada manual rujukan.

4. Menggunakan @WebAppConfiguration in Tests

Sekarang kita faham mengapa kita perlu menambahkan anotasi @WebAppConfiguration di kelas ujian kita, mari kita lihat apa yang berlaku sekiranya kita tidak menambahkannya semasa 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 bahawa kami mengulas anotasi untuk mensimulasikan senario di mana kami lupa menambahkannya. Di sini mudah untuk melihat mengapa ujian akan gagal semasa kita menjalankan ujian JUnit: kita berusaha untuk mengautomen WebApplicationContext secara automatik dalam kelas yang belum kita tetapkan .

Contoh yang lebih tipikal adalah ujian yang menggunakan konfigurasi Spring yang didayakan oleh web; itu benar-benar 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; ... }

Walaupun contoh di atas tidak mengaktifkan WebApplicationContext secara automatik, ia tetap akan gagal kerana cuba menggunakan konfigurasi yang diaktifkan web - WebConfig :

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

Anotasi @EnableWebMvc adalah pelakunya di sini - yang pada dasarnya memerlukan konteks Spring yang diaktifkan oleh web, dan tanpanya - kita akan melihat ujiannya 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 dapat kita perbaiki dengan mudah dengan menambahkan anotasi @WebAppConfiguration ke ujian kami.

5. Kesimpulan

Dalam artikel ini kita menunjukkan bagaimana kita boleh membiarkan TestContext rangka kerja untuk memuatkan WebApplicationContext ke dalam ujian integrasi kita hanya dengan menambah anotasi.

Akhirnya, kami melihat contoh bahawa walaupun jika kami menambahkan @ ContextConfiguration ke ujian, ini tidak akan dapat berfungsi melainkan jika kami menambahkan anotasi @WebAppConfiguration .

Pelaksanaan contoh dalam artikel ini terdapat di repositori kami di GitHub.