2015-04-16 10 views
74

Mam aplikację Spring-Boot, w której właściwości domyślne są ustawiane w plikuw ścieżce classpath (src/main/resources/application.properties).Zastępowanie domyślnych ustawień aplikacji application.properties Spring-Test w wersji

chciałbym zastąpić niektóre ustawienia domyślne w moim teście JUnit z właściwości zadeklarowane w pliku test.properties (src/test/zasobów/test.properties)

przeważnie mam dedykowanego Config klasy dla moich testów JUnit, na przykład

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 { 

} 

raz pierwszy pomyślał, że za pomocą @PropertySource("classpath:test.properties") w klasie TestConfig by rade, ale te właściwości nie zastąpi ustawienia application.properties (patrz Wiosna-Boot nr DOC - 23. Externalized Configuration).

Potem próbowałem użyć -Dspring.config.location=classpath:test.properties podczas wywoływania testu. To się udało - ale nie chcę ustawiać tej właściwości systemowej dla każdego wykonania testu. Tak więc umieściłem go w kodzie

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

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

} 

który niefortunnie znowu nie powiodło się.

Musi być proste rozwiązanie, aby zastąpić ustawienia application.properties w testach JUnit z test.properties, które musiałem przeoczyć.

Odpowiedz

142

Możesz użyć @TestPropertySource, aby zastąpić wartości w application.properties. Od jego javadoc:

źródła własności test może być stosowany do selektywnego nadpisać właściwości zdefiniowane w systemie i własności aplikacja źródeł

Na przykład:

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

} 
+1

To wszystko. Dzięki. Niestety nie działa, gdy jest używany w klasie ExampleApplication.class, więc muszę ustawić go na każdej klasie testowej. Czy to prawda? – FrVaBe

+1

Musi przejść gdzieś w hierarchii klasy testowej, tzn. Można użyć wspólnej superklasy, aby skonfigurować ją w wielu różnych klasach testowych. –

+0

Tak, byłoby to właściwe, ale ponieważ '@ PropertySource' jest obsługiwana w klasach' @ Configuration', dlaczego nie również '@ TestPropertySource' ;-) W każdym razie - zgodnie z oczekiwaniami, framework mnie nie zawiedzie i jeszcze raz dziękuję za udzielenie odpowiedzi na pytanie. – FrVaBe

37

Można również użyć meta-annotations uzewnętrznić konfiguracja. Na przykład:

@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 { } 
+0

Dziękujemy za podzielenie się tym podejściem. Nie znałem dotychczas meta-adnotacji. Tyle wspaniałych rzeczy, które wciąż muszę odkryć ... – FrVaBe

0

W przeciwnym razie możemy zmienić domyślną nazwę nieruchomość konfigurator, ustawiając właściwość spring.config.name=test a następnie posiadające zasób klasy ścieżka src/test/test.properties nasz rodzimy przypadek org.springframework.boot.SpringApplication zostanie automatycznie skonfigurowany z tego oddzielonych test.properties, ignorowanie właściwości aplikacji;

Korzyści: automatyczna konfiguracja testów;

Wadliwość: ujawnienie właściwości "spring.config.name" w C.I. Warstwę

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

spring.config.name = nazwa pliku aplikacji # Config

+2

Ignorowanie 'application.properties' nie jest dla mnie opcją, ponieważ chcę tylko zastąpić _some_ pierwotnych wartości konfiguracyjnych w teście. – FrVaBe

12

Wiosna Boot automatycznie ładuje src/test/resources/application.properties, jeśli stosowane są następujące adnotacje

@RunWith(SpringRunner.class) 
@SpringBootTest 

Więc zmień test.properties do application.properties wykorzystać konfigurację automatyczną.

Jeśli wy * tylko * należy załadować plik właściwości (do środowiska) stosowania mogą również korzystać z następujących, jak wyjaśniono here

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

[Aktualizacja: Nadrzędne pewne właściwości do testowania:]

  1. Dodaj src/main/resources/application-test.properties.
  2. Opisz klasę testową pod numerem @ActiveProfile("test").

Ten ładuje application.properties i następnieapplication-test.properties właściwości w odpowiednim kontekście aplikacji dla przypadku testowego, zgodnie zasadami określonymi here.

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

+0

Nie jestem pewien, czy dobrze jest mieć dwa pliki 'application.properties' na ścieżce klasy (jedna w' src/main/resources' i jedna w 'src/test/resources'). Kto gwarantuje, że oba zostaną podjęte, a które zostaną podjęte jako pierwsze? – FrVaBe

+0

@FrVaBe Spring gwarantuje to! Właściwości profilu głównego są zawsze ładowane. Następnie podczas fazy testowej ładowane są właściwości testowe, dodając/zastępując nowe/istniejące właściwości. Jeśli nie lubisz przechowywania dwóch plików o tej samej nazwie, możesz dodać 'application-test.properties' w' src/main/resources' i określić 'test' jako aktywny profil w teście. – Mohnish

+0

Wiosna nie daje gwarancji. Narzędzie do budowania użyje zasobów testowych na rzecz głównych zasobów podczas testów. Ale w przypadku testu aplikacji.properties główne application.properties będą ignorowane.To nie jest to, czego chcę, ponieważ główna zawiera kilka użytecznych wartości domyślnych i muszę tylko przesłonić niektóre z nich podczas testu (i nie chcę duplikować całego pliku w sekcji testowej). Zobacz [tutaj] (https://twitter.com/snicoll/status/887224501871751168). – FrVaBe

Powiązane problemy