Mengatasi Sifat dalam Ujian Musim Semi

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat pelbagai cara untuk mengatasi sifat dalam ujian Spring.

Spring sebenarnya memberikan sebilangan penyelesaian untuk ini, jadi kita perlu meneroka sedikit di sini.

2. Kebergantungan

Sudah tentu, untuk bekerja dengan ujian Spring, kita perlu menambahkan kebergantungan ujian:

 org.springframework.boot spring-boot-starter-test 2.1.6.RELEASE test 

The bunga-boot-starter ujian pergantungan mengandungi semua yang kita perlukan untuk mengatasi nilai hartanah dalam ujian.

3. Persediaan

Pertama, kita harus membuat kelas dalam aplikasi yang akan menggunakan sifat kita:

@Component public class PropertySourceResolver { @Value("${example.firstProperty}") private String firstProperty; @Value("${example.secondProperty}") private String secondProperty; public String getFirstProperty() { return firstProperty; } public String getSecondProperty() { return secondProperty; } }

Seterusnya, mari berikan nilai kepada mereka. Kita boleh melakukannya dengan membuat application.properties di src / main / resources:

example.firstProperty=defaultFirst example.secondProperty=defaultSecond

4. Menimpa Fail Harta

Sekarang, kita akan mengganti harta tanah dengan meletakkan fail harta tanah dalam sumber ujian. Fail ini mesti berada di classpath yang sama dengan yang default.

Selain itu, ia harus mengandungi semua kunci harta yang ditentukan dalam fail lalai. Oleh itu, kami akan menambahkan fail application.properties ke dalam src / test / resources :

example.firstProperty=file example.secondProperty=file

Mari juga tambahkan ujian yang akan menggunakan penyelesaian kami:

@RunWith(SpringRunner.class) @SpringBootTest public class TestResourcePropertySourceResolverIntegrationTest { @Autowired private PropertySourceResolver propertySourceResolver; @Test public void shouldTestResourceFile_overridePropertyValues() { String firstProperty = propertySourceResolver.getFirstProperty(); String secondProperty = propertySourceResolver.getSecondProperty(); assertEquals("file", firstProperty); assertEquals("file", secondProperty); } }

Kaedah ini sangat berkesan apabila kita ingin mengesampingkan banyak sifat dari fail.

Dan, jika kita tidak meletakkan contoh.secondProperty dalam fail, konteks aplikasi tidak akan menemui harta ini.

5. Profil Spring

Di bahagian ini, kami akan belajar bagaimana menangani masalah kami dengan menggunakan Profil Spring. Tidak seperti kaedah sebelumnya, kaedah ini menggabungkan sifat dari fail lalai dan fail berprofil .

Pertama, mari buat aplikasi - test.properties file di src / test / resources:

example.firstProperty=profile

Selepas itu, kami akan membuat ujian yang akan menggunakan profil ujian :

@RunWith(SpringRunner.class) @SpringBootTest @ActiveProfiles("test") public class ProfilePropertySourceResolverIntegrationTest { @Autowired private PropertySourceResolver propertySourceResolver; @Test public void shouldProfiledProperty_overridePropertyValues() { String firstProperty = propertySourceResolver.getFirstProperty(); String secondProperty = propertySourceResolver.getSecondProperty(); assertEquals("profile", firstProperty); assertEquals("defaultSecond", secondProperty); } }

Pendekatan ini membolehkan kita menggunakan nilai lalai dan ujian. Oleh itu, ini adalah kaedah yang baik apabila kita perlu mengganti banyak sifat dari fail tetapi kita masih mahu menggunakan sifat lalai .

Selain itu, kami dapat mengetahui lebih lanjut mengenai profil Spring dalam tutorial Profil Musim Semi kami .

6. @SpringBootTest

Cara lain untuk mengatasi nilai harta tanah adalah dengan menggunakan anotasi @SpringBootTest :

@RunWith(SpringRunner.class) @SpringBootTest(properties = { "example.firstProperty=annotation" }) public class SpringBootPropertySourceResolverIntegrationTest { @Autowired private PropertySourceResolver propertySourceResolver; @Test public void shouldSpringBootTestAnnotation_overridePropertyValues() { String firstProperty = propertySourceResolver.getFirstProperty(); String secondProperty = propertySourceResolver.getSecondProperty(); Assert.assertEquals("annotation", firstProperty); Assert.assertEquals("defaultSecond", secondProperty); } }

Seperti yang kita dapat lihat, yang example.firstProperty telah diatasi manakala example.secondProperty belum . Oleh itu, ini adalah penyelesaian yang baik apabila kita hanya perlu menukar sifat khusus untuk ujian. Ini adalah satu-satunya kaedah yang memerlukan penggunaan Spring Boot.

7. TestPropertySourceUtils

Di bahagian ini, kita akan belajar cara mengganti harta tanah dengan menggunakan kelas TestPropertySourceUtils di ApplicationContextInitializer.

The TestPropertySourceUtils datang dengan dua kaedah yang boleh kita gunakan untuk menentukan nilai harta yang berbeza.

Mari buat kelas pemula yang akan kami gunakan dalam ujian kami:

public class PropertyOverrideContextInitializer implements ApplicationContextInitializer { static final String PROPERTY_FIRST_VALUE = "contextClass"; @Override public void initialize(ConfigurableApplicationContext configurableApplicationContext) { TestPropertySourceUtils.addInlinedPropertiesToEnvironment( configurableApplicationContext, "example.firstProperty=" + PROPERTY_FIRST_VALUE); TestPropertySourceUtils.addPropertiesFilesToEnvironment( configurableApplicationContext, "context-override-application.properties"); } }

Seterusnya, kami akan menambahkan fail konteks-override-application.properties ke dalam src / test / resources:

example.secondProperty=contextFile

Akhirnya, kita harus membuat kelas ujian yang akan menggunakan pemula kami:

@RunWith(SpringRunner.class) @ContextConfiguration( initializers = PropertyOverrideContextInitializer.class, classes = Application.class) public class ContextPropertySourceResolverIntegrationTest { @Autowired private PropertySourceResolver propertySourceResolver; @Test public void shouldContext_overridePropertyValues() { final String firstProperty = propertySourceResolver.getFirstProperty(); final String secondProperty = propertySourceResolver.getSecondProperty(); assertEquals(PropertyOverrideContextInitializer.PROPERTY_FIRST_VALUE, firstProperty); assertEquals("contextFile", secondProperty); } }

The example.firstProperty telah Pembatal daripada kaedah Inlined.

The example.secondProperty telah Pembatal dari fail tertentu dalam kaedah kedua. Pendekatan ini membolehkan kita menentukan nilai harta yang berbeza ketika memulakan konteks.

8. Kesimpulannya

Dalam tutorial ini, kami telah memfokuskan kepada pelbagai cara yang boleh kami gunakan untuk mengatasi sifat dalam ujian kami.

Kami juga telah mengetahui kapan harus menggunakan setiap penyelesaian atau dalam beberapa kes untuk mencampurkannya.

Sudah tentu, kami juga mempunyai anotasi @TestPropertySource .

Seperti biasa, kod contoh boleh didapati di GitHub.