Saya memiliki aplikasi Spring-Boot di mana properti default diatur dalam application.properties
file di classpath (src / main / resources / application.properties).
Saya ingin mengganti beberapa pengaturan default dalam uji JUnit saya dengan properti yang dideklarasikan dalam test.properties
file (src / test / resources / test.properties)
Saya biasanya memiliki Kelas Konfigurasi khusus untuk Tes Junit saya, misalnya
package foo.bar.test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
}
Saya pertama kali berpikir bahwa menggunakan @PropertySource("classpath:test.properties")
di kelas TestConfig akan melakukan trik, tetapi properti ini tidak akan menimpa pengaturan application.properties (lihat Spring-Boot Reference Doc - 23. Konfigurasi Eksternalisasi ).
Kemudian saya mencoba menggunakan -Dspring.config.location=classpath:test.properties
ketika menjalankan tes. Itu berhasil - tetapi saya tidak ingin mengatur properti sistem ini untuk setiap eksekusi tes. Jadi saya memasukkannya ke dalam kode
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
yang sayangnya sekali lagi tidak berhasil.
Pasti ada solusi sederhana tentang cara mengesampingkan application.properties
pengaturan dalam tes JUnit dengan test.properties
yang harus saya abaikan.
sumber
Jawaban:
Anda dapat menggunakan
@TestPropertySource
untuk mengganti nilai diapplication.properties
. Dari javadoc-nya:Sebagai contoh:
sumber
@TestPropertySource
dapat menerimaproperties
argumen untuk menimpa beberapa properti inline, seperti@TestPropertySource(properties = "myConf.myProp=valueInTest")
, itu berguna jika Anda tidak ingin file properti yang benar-benar baru.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
sudah usang, dan Anda harus menggunakan@SpringBootTest
Spring Boot otomatis dimuat
src/test/resources/application.properties
, jika anotasi berikut digunakanJadi, mengubah nama
test.properties
untukapplication.properties
memanfaatkan konfigurasi otomatis.[ Pembaruan: Mengganti properti tertentu untuk pengujian ]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Ini memuat
application.properties
dan kemudianapplication-test.properties
properti ke dalam konteks aplikasi untuk kasus uji, sesuai aturan yang ditetapkan di sini .Demo - https://github.com/mohnish82/so-spring-boot-testprops
sumber
application.properties
file di classpath (satu masuksrc/main/resources
dan satu masuksrc/test/resources
). Siapa yang menjamin bahwa keduanya akan diambil dan mana yang akan diambil lebih dulu?application-test.properties
dalamsrc/main/resources
dan menentukantest
sebagai profil aktif dalam kasus uji.src/test/resources/application.properties
yang dimuat selama fase pengujian,src/main/resources/application.properties
yang diabaikan.application-default.properties
dan itu akan dipertimbangkan karena Anda secara otomatis menjalankan profil "default" (jika tidak dinyatakan lainnya).Anda juga dapat menggunakan meta-anotasi untuk mengeksternalisasi konfigurasi. Sebagai contoh:
sumber
Pendekatan lain yang cocok untuk mengganti beberapa properti dalam pengujian Anda, jika Anda menggunakan
@SpringBootTest
anotasi:sumber
SpringBootTest
memuat file application.properties?TLDR:
Jadi apa yang saya lakukan adalah memiliki standar
src/main/resources/application.properties
dan jugasrc/test/resources/application-default.properties
tempat saya menimpa beberapa pengaturan untuk SEMUA tes saya.Seluruh cerita
Saya mengalami masalah yang sama dan sejauh ini tidak menggunakan profil. Tampaknya merepotkan harus melakukannya sekarang dan ingat menyatakan profil - yang dapat dengan mudah dilupakan.
Kuncinya adalah, untuk meningkatkan bahwa profil tertentu
application-<profile>.properties
menimpa pengaturan di profil umum. Lihat https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties .sumber
Penjelasan sederhana:
Jika Anda seperti saya dan Anda memiliki yang sama
application.properties
disrc/main/resources
dansrc/test/resources
, dan Anda bertanya-tanya mengapaapplication.properties
di folder tes Anda tidak mengesampingkan paraapplication.properties
sumber daya utama Anda, baca terus ...Jika Anda memiliki di
application.properties
bawahsrc/main/resources
dan diapplication.properties
bawah yang samasrc/test/resources
, yangapplication.properties
diambil, tergantung pada bagaimana Anda menjalankan tes Anda . Struktur foldersrc/main/resources
dansrc/test/resources
, adalah konvensi arsitektur Maven, jadi jika Anda menjalankan tes sepertimvnw test
atau bahkangradlew test
,application.properties
insrc/test/resources
akan dijemput, karena test classpath akan mendahului classpath utama . Tetapi, jika Anda menjalankan tes Anda sepertiRun as JUnit Test
di Elipse / STS,application.properties
insrc/main/resources
akan dijemput, karena jalur utama utama mendahului jalur kelas uji .Anda dapat memeriksanya dengan membuka
Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"
.Anda akan melihat sesuatu seperti:
Apakah Anda melihat bahwa \ main terlebih dahulu, lalu \ test ? Benar, Ini semua tentang classpath :-)
Bersulang
sumber
sumber
Jika Anda menggunakan Spring 5.2.5 dan Spring Boot 2.2.6 dan ingin mengganti hanya beberapa properti alih-alih seluruh file. Anda dapat menggunakan anotasi baru: @DynamicPropertySource
sumber
Kalau tidak, kita dapat mengubah nama konfigurator properti default, mengatur properti
spring.config.name=test
dan kemudian memiliki sumber daya kelas-jalursrc/test/test.properties
instance asli kitaorg.springframework.boot.SpringApplication
akan secara otomatis dikonfigurasi dari properti test.prop terpisah ini, mengabaikan properti aplikasi;Manfaat: konfigurasi otomatis pengujian;
Kelemahan: memperlihatkan properti "spring.config.name" di layer CI
ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
sumber
application.properties
bukanlah pilihan bagi saya karena saya hanya ingin mengganti beberapa nilai konfigurasi asli dalam pengujian.Anda juga dapat membuat file application.properties di src / test / resources di mana JUnits Anda ditulis.
sumber