Junit Test'te varsayılan Spring-Boot uygulamasını geçersiz kılın. Özellikler ayarları


198

application.propertiesSınıf özellikleri (src / main / resources / application.properties) bir dosyada varsayılan özellikleri ayarlanır bir Spring-Boot uygulaması var .

Bir test.propertiesdosyada bildirilen özelliklerle (src / test / resources / test.properties) JUnit testimdeki bazı varsayılan ayarları geçersiz kılmak istiyorum

Genellikle Junit Testlerim için özel bir Config Class'ım var;

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 {

}

İlk @PropertySource("classpath:test.properties")olarak TestConfig sınıfında kullanmanın hile yapacağını düşündüm , ancak bu özellikler application.properties ayarlarının üzerine yazmayacak (bkz. Spring-Boot Reference Doc - 23. Harici Yapılandırma ).

Sonra -Dspring.config.location=classpath:test.propertiestesti başlatırken kullanmaya çalıştım . Bu başarılı oldu - ancak her test yürütmesi için bu sistem özelliğini ayarlamak istemiyorum. Böylece koda koydum

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

  static {
    System.setProperty("spring.config.location", "classpath:test.properties");
  }

}

talihsiz bir şekilde yine başarılı olamadı.

Ben gözden kaçmış olması gerektiği application.propertiesile JUnit testlerinde ayarları geçersiz kılmak için basit bir çözüm test.propertiesolmalıdır.


Yalnızca birkaç özelliği yapılandırmanız gerekirse, yeni @DynamicPropertySource ek açıklamasını kullanabilirsiniz. stackoverflow.com/a/60941845/8650621
Felipe Desiderati

Yanıtlar:


294

@TestPropertySourceİçindeki değerleri geçersiz kılmak için kullanabilirsiniz application.properties. Javadoc'tan:

test özellik kaynakları, sistem ve uygulama özellik kaynaklarında tanımlanan özellikleri seçici olarak geçersiz kılmak için kullanılabilir

Örneğin:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}

2
Bu kadar. Teşekkürler. Ne yazık ki her test sınıfında ayarlamak zorunda bu yüzden SampleApplication.class üzerinde kullanıldığında çalışmıyor. Bu doğru mu?
FrVaBe

1
Test sınıfının hiyerarşisinde bir yere gitmesi gerekir, yani bir dizi farklı test sınıfında yapılandırmak için ortak bir üst sınıf kullanabilirsiniz.
Andy Wilkinson

65
Ayrıca , tamamen yepyeni bir özellik dosyası istemediğinizde , bazı satır içi özelliklerin üzerine yazmak için @TestPropertySourcebir propertiesargümanı kabul edebileceğini unutmayın @TestPropertySource(properties = "myConf.myProp=valueInTest").
dyng

2
Bir dizide birden fazla dosya ve ayrıca dosya sistemindeki dosyaları belirtebilirsiniz (ancak CI sunucusunda çalışmayabilirler):@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
Adam

9
Not, bu @SpringApplicationConfigurationzaten kullanımdan kaldırıldı ve kullanmalısınız@SpringBootTest
mrkernelpanic

74

src/test/resources/application.propertiesAşağıdaki ek açıklamalar kullanılırsa Spring Boot otomatik olarak yüklenir

@RunWith(SpringRunner.class)
@SpringBootTest

Bu nedenle, otomatik yapılandırmayı kullanmak test.propertiesiçin application.propertiesolarak yeniden adlandırın .

Eğer varsa sadece * * açıklandığı gibi ayrıca aşağıdakileri kullanabilirsiniz (Çevre içine) özelliklerini dosyası yüklemek için gereğini burada

@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[ Güncelleme: Test için belirli özellikleri geçersiz kılma ]

  1. Ekle src/main/resources/application-test.properties.
  2. Test sınıfına açıklama ekleyin @ActiveProfiles("test").

Bu , burada tanımlanan kurallara göre test durumu için uygulama bağlamını yükler application.propertiesve ardından application-test.properties özellikleri .

Demo - https://github.com/mohnish82/so-spring-boot-testprops


1
application.propertiesSınıf yolunda iki dosya (bir içeri src/main/resourcesve bir içeri) olması iyi bir fikir olup olmadığından emin değilim src/test/resources. Her ikisinin de hangisinin önce alınacağını kim garanti eder?
FrVaBe

3
@FrVaBe Spring bunu garanti edecek! Ana profil özellikleri her zaman yüklenir. Daha sonra test aşaması sırasında, test özellikleri yüklenir, yeni / mevcut özellikler eklenir / geçersiz kılınır. Aynı ada sahip iki dosya tutmak sevmiyorum, o zaman ekleyebilir application-test.propertiesiçinde src/main/resourcesve belirtmek testtest durumu aktif profil olarak.
Mohnish

7
Bahar bir garanti vermez. Derleme aracı, test kaynaklarını testler sırasında ana kaynaklar lehine kullanacaktır. Ancak bir test başvurusu durumunda. Özellikler ana uygulama özellikleri de göz ardı edilecektir. Ana istediğim birkaç yararlı varsayılan değerler içerdiğinden ve test sırasında sadece bazılarını geçersiz kılmam gerektiğinden istediğim bu değil (ve tüm dosyayı test bölümünde çoğaltmak istemiyorum). Buraya bakın .
FrVaBe

6
Doğru, yalnızca src/test/resources/application.propertiestest aşamasında tanımlanan özellikler src/main/resources/application.propertiesgöz ardı edilir.
Mohnish

11
Şu ana kadar profil kullanmıyorsanız, özel bir "test" profiline ihtiyacınız yoktur. Test özelliklerinizi application-default.propertiesadlandırmanız yeterlidir; otomatik olarak "varsayılan" profili çalıştırdığınız için (başka bir bildirim yapılmadıysa) dikkate alınacaktır.
FrVaBe

65

Yapılandırmayı dışlaştırmak için meta ek açıklamaları da kullanabilirsiniz . Örneğin:

@RunWith(SpringJUnit4ClassRunner.class)
@DefaultTestAnnotations
public class ExampleApplicationTests { 
   ...
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public @interface DefaultTestAnnotations { }

21

@SpringBootTestEk açıklama kullanıyorsanız, testinizdeki birkaç özelliği geçersiz kılmak için uygun başka bir yaklaşım :

@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})

1
.properties SpringBootTestdosyasını nasıl yükler?
TuGordoBello

8

TLDR:

Yani ne yaptım standart src/main/resources/application.propertiesve aynı zamanda bir src/test/resources/application-default.propertiesyerde ben tüm testlerim için bazı ayarları geçersiz kılmak oldu.

Tüm hikaye

Aynı problemle karşılaştım ve şu ana kadar profil kullanmıyordum. Şimdi bunu yapmak ve profili beyan etmeyi hatırlamak zor olabilir - ki bu kolayca unutulabilir.

İşin püf noktası, belirli bir profilin application-<profile>.propertiesgenel profildeki ayarları geçersiz kılmasıdır. Bkz. Https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties .


3

Basit açıklama:

Eğer benim gibi olan ve aynı varsa application.propertiesiçinde src/main/resourcesve src/test/resourcesve vardır merak neden application.propertiestest klasöründe değil ağır basanapplication.properties ana kaynaklarda, okumaya ...

Eğer varsa application.propertiesaltında src/main/resourcesve aynı application.propertiesaltında src/test/resources, application.propertiesaldı alır, size testler nasıl bağlıdır . Klasör yapısı src/main/resources ve src/test/resources, sen gibi testi eğer öyleyse, bir Maven mimari kongre olduğunu mvnw testve hatta gradlew test, application.propertiesiçinde src/test/resourcesolarak, kaldırdı alacak Test sınıf yolu önce gelecek ana sınıf yolunu. Ancak, testinizi Run as JUnit TestElipse / STS'de olduğu gibi çalıştırırsanız , ana sınıf yolu test sınıfyolundan önce geldiğinde , application.propertiesgiriş src/main/resourcesalınacaktır .

Bunu açarak kontrol edebilirsiniz Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line".

Gibi bir şey göreceksiniz:

XXXbin \ javaw.exe -ea -Dfile.encoding = UTF-8-sınıfyolu XXX \ workspace-spring-tool-suite-4-4.5.1.RELEASE \ project_name \ bin \ main; XXX \ çalışma alanı-yay-araç takımını-4-4.5.1.RELEASE \ project_name \ bin \ testi;

\ Main'nin önce geldiğini ve sonra \ test ettiğini görüyor musunuz ? Doğru, hepsi sınıf yolu :-)

Şerefe


1
I just configured min as the following :

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console


# changing the name of my data base for testing
spring.datasource.url= jdbc:h2:mem:mockedDB
spring.datasource.username=sa
spring.datasource.password=sa



# in testing i don`t need to know the port

#Feature that determines what happens when no accessors are found for a type
#(and there are no annotations to indicate it is meant to be serialized).
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false`enter code here`

1

Spring 5.2.5 ve Spring Boot 2.2.6 kullanıyorsanız ve tüm dosya yerine yalnızca birkaç özelliği geçersiz kılmak istiyorsanız. Yeni ek açıklamayı kullanabilirsiniz: @DynamicPropertySource

@SpringBootTest
@Testcontainers
class ExampleIntegrationTests {

    @Container
    static Neo4jContainer<?> neo4j = new Neo4jContainer<>();

    @DynamicPropertySource
    static void neo4jProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.data.neo4j.uri", neo4j::getBoltUrl);
    }
}

0

Aksi takdirde, varsayılan özellik yapılandırıcı adını değiştirebilir, özelliği ayarlayabilir spring.config.name=testve daha sonra src/test/test.propertiesyerel org.springframework.boot.SpringApplicationörneğimiz olan sınıf yolu kaynağına sahip olarak , uygulama özelliklerini yok sayarak bu ayrılmış test.properties öğesinden otomatik olarak yapılandırılır;

Faydası: testlerin otomatik yapılandırılması;

Dezavantajı: CI katmanında "spring.config.name" özelliğini gösterme

ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config.name = uygulama # Yapılandırma dosya adı


5
Testteki orijinal yapılandırma değerlerinin application.propertiesyalnızca bazılarını geçersiz kılmak istediğim için yoksaymak benim için bir seçenek değil .
FrVaBe

Ben src / main / resources / application.properties yüklemeyen tek bir test için bir yol arıyordum ve bu kadar. Bir dosya oluşturun: src / test / resources / empty.properties ve ek açıklamaları, ana özellikleri yoksayması gereken testlere ekleyin. @TestPropertySource (properties = "spring.config.name = boş")
rvertigo

Her junit test yöntemi için belirli bir özellik değeri nasıl ayarlanır?
Nicolas

0

JUnits'inizin yazıldığı src / test / resources dizininde bir application.properties dosyası da oluşturabilirsiniz.


Bu nasıl yardımcı olur? ^^
jumping_monkey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.