Spring Boot memungkinkan kita mengganti file application.properties dengan yang setara dengan YAML. Namun saya tampaknya menemui hambatan dengan tes saya. Jika saya memberi anotasi TestConfiguration
(konfigurasi Java sederhana) saya, ia mengharapkan file properti.
Misalnya ini tidak berhasil:
@PropertySource(value = "classpath:application-test.yml")
Jika saya memiliki ini di file YAML saya:
db:
url: jdbc:oracle:thin:@pathToMyDb
username: someUser
password: fakePassword
Dan saya akan memanfaatkan nilai-nilai itu dengan sesuatu seperti ini:
@Value("${db.username}") String username
Namun, saya berakhir dengan kesalahan seperti ini:
Could not resolve placeholder 'db.username' in string value "${db.username}"
Bagaimana saya dapat memanfaatkan kebaikan YAML dalam pengujian saya juga?
spring
spring-boot
checketts
sumber
sumber
Jawaban:
Spring-boot memiliki bantuan untuk ini, tambahkan saja
di bagian atas kelas pengujian Anda atau superclass pengujian abstrak.
Sunting: Saya menulis jawaban ini lima tahun lalu. Itu tidak bekerja dengan versi terbaru dari Spring Boot. Inilah yang saya lakukan sekarang (harap terjemahkan Kotlin ke Java jika perlu):
ditambahkan ke atas, lalu
ke konteksnya.
sumber
@SpringJUnitConfig(value = {...}, initializers = {ConfigFileApplicationContextInitializer.class})
Seperti yang disebutkan
@PropertySource
tidak memuat file yaml. Sebagai solusinya, muat file Anda sendiri dan tambahkan properti yang dimuat keEnvironment
.Penerapan
ApplicationContextInitializer
:Tambahkan penginisialisasi Anda ke pengujian Anda:
sumber
YamlFileApplicationContextInitializer
kelas di mana lokasi YAML ditentukan per kasus uji. Jika menurut Anda itu menarik, silakan menggabungkannya ke dalam jawaban Anda dan saya akan menghapus milik saya. Beri tahu saya di komentar di bawah jawaban saya.@PropertySource
dapat dikonfigurasi denganfactory
argumen. Jadi Anda bisa melakukan sesuatu seperti:Di mana
YamlPropertyLoaderFactory
pemuat properti khusus Anda:Terinspirasi oleh https://stackoverflow.com/a/45882447/4527110
sumber
IllegalStateException
ketika file tidak ada dan bukan yang tepatFileNotFoundException
- jadi untuk membuat ini berfungsi@PropertySource(..., ignoreResourceNotFound = true)
, Anda perlu menangkap dan menangani kasus ini:try { return new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource(), null); } catch (IllegalStateException e) { throw (IOException) e.getCause(); }
CompositePropertySource propertySource = new CompositePropertySource(name); new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()).stream().forEach(propertySource::addPropertySource); return propertySource;
@PropertySource
hanya mendukung file properti (ini adalah batasan dari Spring, bukan Boot itu sendiri). Jangan ragu untuk membuka tiket permintaan fitur di JIRA .sumber
ApplicationContextInitializer
dan menambahkannya ke konfigurasi pengujian (cukup gunakan aYamlPropertySourceLoader
untuk meningkatkanEnvironment
). Secara pribadi saya lebih suka jika@PropertySource
mendukung perilaku ini secara asli.Pilihan lainnya adalah mengatur
spring.config.location
melalui@TestPropertySource
:sumber
@TestPropertySource(properties = {"spring.config.location=classpath:application-${test.env}.yml" })
IMO milik Anda adalah jawaban terbaik dari semuanya.@TestPropertySource(properties = {"spring.config.location=classpath:application-config.yml,classpath:test-config.yml,..." })
@SpringBootTest
anotasiDari Spring Boot 1.4, Anda dapat menggunakan
@SpringBootTest
anotasi baru untuk melakukannya dengan lebih mudah (dan untuk menyederhanakan pengaturan pengujian integrasi Anda secara umum) dengan melakukan bootstrap pada pengujian integrasi Anda menggunakan dukungan Spring Boot.Detail di Blog Musim Semi .
Sejauh yang saya tahu, ini berarti Anda mendapatkan semua manfaat dari kebaikan konfigurasi eksternal Spring Boot seperti dalam kode produksi Anda, termasuk secara otomatis mengambil konfigurasi YAML dari classpath.
Secara default, anotasi ini akan
tetapi Anda dapat menentukan kelas konfigurasi lain jika diperlukan.
Untuk kasus ini, Anda dapat menggabungkan
@SpringBootTest
dengan@ActiveProfiles( "test" )
dan Spring akan mengambil konfigurasi YAML Anda, asalkan mengikuti standar Boot penamaan normal (yaituapplication-test.yml
).Catatan:
SpringRunner.class
adalah nama baru untukSpringJUnit4ClassRunner.class
sumber
Pendekatan untuk memuat properti yaml, IMHO dapat dilakukan dengan dua cara:
Sebuah. Anda dapat meletakkan konfigurasi di lokasi standar -
application.yml
di classpath root - biasanyasrc/main/resources
dan properti yaml ini akan dimuat secara otomatis oleh Spring boot dengan nama jalur yang diratakan yang telah Anda sebutkan.b. Pendekatan kedua sedikit lebih ekstensif, pada dasarnya tentukan kelas untuk menampung properti Anda dengan cara ini:
Jadi pada dasarnya ini adalah mengatakan bahwa memuat file yaml dan mengisi kelas DbProperties berdasarkan elemen root "db".
Sekarang untuk menggunakannya di kelas mana pun, Anda harus melakukan ini:
Salah satu dari pendekatan ini akan bekerja untuk Anda dengan bersih menggunakan Spring-boot.
sumber
snakeyaml
ditarik sebagai ketergantungan transitif olehspring-boot-starter
, jadi seharusnya tidak perlu menambahkannya ke Andapom.xml
ataubuild.gradle
, kecuali Anda memiliki keinginan yang mengakar untuk menggunakan versi yang berbeda. :)locations
bukanpath
, danConfigFileApplicationContextInitializer
itu juga wajib.Saya menemukan solusi dengan menggunakan
@ActiveProfiles("test")
dan menambahkan file application-test.yml ke src / test / resources.Itu akhirnya terlihat seperti ini:
File application-test.yml hanya berisi properti yang ingin saya timpa dari application.yml (yang dapat ditemukan di src / main / resources).
sumber
@Value("${my.property}")
tetapi berfungsi dengan baik jika saya gunakanenvironment.getProperty("my.property")
.itu karena Anda belum mengkonfigurasi snakeyml. musim semi boot datang dengan fitur @EnableAutoConfiguration. ada konfigurasi snakeyml juga ketika Anda memanggil anotasi ini ..
Ini cara saya:
ini tes saya:
sumber
Saya perlu membaca beberapa properti ke dalam kode saya dan ini berfungsi dengan spring-boot 1.3.0.RELEASE
sumber
Memuat file yml kustom dengan konfigurasi beberapa profil di Spring Boot.
1) Tambahkan kacang properti dengan SpringBootApplication dimulai sebagai berikut
2) Konfigurasi objek Java pojo sebagai berikut
3) Buat yml kustom (dan letakkan di bawah jalur sumber daya sebagai berikut, Nama file YML: test-service-config.yml
Misalnya Config di file yml.
sumber
Saya berada dalam situasi tertentu di mana saya tidak dapat memuat kelas @ConfigurationProperties karena penamaan properti file khusus. Pada akhirnya, satu-satunya hal yang berhasil adalah (terima kasih @Mateusz Balbus):
sumber
Selamat menggunakan perpustakaan saya. Sekarang yaml , toml , hocon didukung.
Sumber: github.com
sumber
Ini bukan jawaban untuk pertanyaan awal, tetapi solusi alternatif untuk kebutuhan memiliki konfigurasi yang berbeda dalam pengujian ...
Daripada
@PropertySource
Anda bisa menggunakan-Dspring.config.additional-location=classpath:application-tests.yml
.Sadarilah, akhiran
tests
itu tidak berarti profil ...Dalam satu file YAML, seseorang dapat menentukan beberapa profil, yang dapat diwariskan satu sama lain, baca lebih lanjut di sini - Penyelesaian properti untuk beberapa profil Spring (konfigurasi yaml)
Kemudian, Anda dapat menentukan dalam pengujian Anda, bahwa profil aktif (menggunakan
@ActiveProfiles("profile1,profile2")
) adalahprofile1,profile2
tempat yangprofile2
akan dengan mudah menimpa (beberapa, satu tidak perlu menimpa semua) properti dariprofile1
.sumber
Saya telah mencoba semua pertanyaan yang terdaftar, tetapi semuanya tidak berfungsi untuk tugas saya: menggunakan file yaml tertentu untuk beberapa unit test. Dalam kasus saya, ini berfungsi seperti ini:
sumber
Tidak perlu menambahkan seperti YamlPropertyLoaderFactory atau YamlFileApplicationContextInitializer. Anda harus mengubah ide Anda. seperti proyek musim semi biasa. Anda tahu, tidak menggunakan konfigurasi Java. Hanya * .xml
Ikuti langkah ini:
Cukup tambahkan applicationContext.xml suka
lalu tambahkan
untuk Anda
ApplicationMainClass
.Ini dapat membantu memindai application-test.yml Anda
sumber