Mam aplikację Spring-Boot, w której właściwości domyślne są ustawione w application.properties
pliku w ścieżce klasy (src / main / resources / application.properties).
Chciałbym zastąpić niektóre ustawienia domyślne w moim teście JUnit właściwościami zadeklarowanymi w test.properties
pliku (src / test / resources / test.properties)
Zwykle mam dedykowaną klasę konfiguracji dla moich testów Junit, np
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 {
}
Najpierw pomyślałem, że użycie @PropertySource("classpath:test.properties")
w klasie TestConfig załatwi sprawę, ale te właściwości nie zastąpią ustawień application.properties (patrz Dokumentacja Spring-Boot Reference - 23. Konfiguracja zewnętrzna ).
Następnie 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 to w kodzie
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
co niestety znów się nie powiodło.
Musi istnieć proste rozwiązanie, w jaki sposób zastąpić application.properties
ustawienia w testach JUnit, z test.properties
czym musiałem przeoczyć.
źródło
Odpowiedzi:
Możesz użyć
@TestPropertySource
do zastąpienia wartości wapplication.properties
. Z javadoc:Na przykład:
źródło
@TestPropertySource
można zaakceptowaćproperties
argument zastępujący niektóre właściwości wbudowane, na przykład jest@TestPropertySource(properties = "myConf.myProp=valueInTest")
to przydatne w przypadku, gdy nie chcesz całkowicie nowego pliku właściwości.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
jest to już przestarzałe i powinieneś użyć@SpringBootTest
Spring Boot automatycznie ładuje się
src/test/resources/application.properties
, jeśli zostaną użyte następujące adnotacjeZmień nazwę
test.properties
na,application.properties
aby korzystać z automatycznej konfiguracji.[ Aktualizacja: przesłanianie niektórych właściwości do testowania ]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.To ładuje,
application.properties
a następnieapplication-test.properties
właściwości do kontekstu aplikacji dla przypadku testowego, zgodnie z tu zdefiniowanymi regułami .Demo - https://github.com/mohnish82/so-spring-boot-testprops
źródło
application.properties
plików na ścieżce klasy (jeden dosrc/main/resources
i jeden dosrc/test/resources
). Kto gwarantuje, że oba zostaną wzięte, a który zostanie wzięty jako pierwszy?application-test.properties
wsrc/main/resources
i określićtest
jako aktywnego profilu w przypadku testu.src/test/resources/application.properties
są ładowane podczas fazy testowej,src/main/resources/application.properties
są ignorowane.application-default.properties
a zostaną one uwzględnione, ponieważ automatycznie uruchamiasz profil „domyślny” (jeśli nie został zadeklarowany).Możesz także użyć meta-adnotacji do uzewnętrznienia konfiguracji. Na przykład:
źródło
Inne podejście odpowiednie do zastąpienia kilku właściwości w teście, jeśli używasz
@SpringBootTest
adnotacji:źródło
SpringBootTest
załadować plik application.properties?TLDR:
Więc to, co zrobiłem, to mieć standard,
src/main/resources/application.properties
a także miejsce, wsrc/test/resources/application-default.properties
którym zastępuję niektóre ustawienia WSZYSTKICH moich testów.Cała historia
Natknąłem się na ten sam problem i do tej pory nie korzystałem z profili. Wydawało się, że kłopotliwe jest robić to teraz i pamiętać o ogłoszeniu profilu - o którym łatwo zapomnieć.
Sztuka polega na tym, aby wykorzystać to, że określony profil
application-<profile>.properties
zastępuje ustawienia w profilu ogólnym. Zobacz https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties .źródło
Proste wyjaśnienie:
Jeśli jesteś podobny do mnie i masz to samo
application.properties
wsrc/main/resources
isrc/test/resources
, a ty zastanawiasz się , dlaczegoapplication.properties
w folderze testowym nie jest nadrzędneapplication.properties
w głównych zasobów, czytaj dalej ...Jeśli masz
application.properties
undersrc/main/resources
i to samoapplication.properties
undersrc/test/resources
, któreapplication.properties
zostanie podniesione, zależy od tego, jak przeprowadzasz testy . Folder strukturasrc/main/resources
isrc/test/resources
, to Maven konwencja architektoniczny, więc jeśli uruchomić test podobnymvnw test
lub nawetgradlew test
,application.properties
wsrc/test/resources
zostanie wybrana, jako próba classpath poprzedzi główną ścieżkę klasy. Ale jeśli uruchomisz test tak jakRun as JUnit Test
w Elipse / STS,application.properties
insrc/main/resources
zostanie odebrane, ponieważ główna ścieżka klasy poprzedza ścieżkę klasy testu .Możesz to sprawdzić, otwierając
Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"
.Zobaczysz coś takiego:
Czy widzisz, że \ main jest pierwszy, a potem \ test ? Racja, chodzi o ścieżkę klas :-)
Twoje zdrowie
źródło
źródło
Jeśli używasz Spring 5.2.5 i Spring Boot 2.2.6 i chcesz zastąpić tylko kilka właściwości zamiast całego pliku. Możesz użyć nowej adnotacji: @DynamicPropertySource
źródło
W przeciwnym razie możemy zmienić domyślną nazwę konfiguratora właściwości, ustawiając właściwość,
spring.config.name=test
a następnie mając zasób klasy,src/test/test.properties
nasza natywna instancjaorg.springframework.boot.SpringApplication
zostanie automatycznie skonfigurowana z tego oddzielnego pliku test.properties, ignorując właściwości aplikacji;Korzyści: automatyczna konfiguracja testów;
Wada: ujawnienie właściwości „spring.config.name” na warstwie CI
ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
źródło
application.properties
nie jest dla mnie opcją, ponieważ chcę zastąpić tylko niektóre oryginalne wartości konfiguracji w teście.Możesz także utworzyć plik application.properties w src / test / resources, w którym zapisane są JUnits.
źródło