web-dev-qa-db-fra.com

Remplacement des paramètres par défaut de l'application.properties Spring-Boot dans Junit Test

J'ai une application Spring-Boot où les propriétés par défaut sont définies dans un fichier application.properties dans le chemin d'accès aux classes (src/main/resources/application.properties).

J'aimerais remplacer certains paramètres par défaut de mon test JUnit par des propriétés déclarées dans un fichier test.properties (src/test/resources/test.properties).

J'ai généralement une classe de configuration dédiée pour mes tests Junit, par exemple.

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 {

}

J'ai d'abord pensé qu'utiliser @PropertySource("classpath:test.properties") dans la classe TestConfig ferait l'affaire, mais que ces propriétés ne remplaceraient pas les paramètres application.properties (voir Doc - Référence de Spring-Boot - 23. Configuration externalisée ).

Ensuite, j'ai essayé d'utiliser -Dspring.config.location=classpath:test.properties lors de l'appel du test. Cela a réussi - mais je ne veux pas définir cette propriété système pour chaque exécution de test. Donc je le mets dans le code

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

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

}

qui malheureusement n’a de nouveau pas été couronnée de succès.

Il doit y avoir une solution simple sur la façon de remplacer les paramètres application.properties dans les tests JUnit avec test.properties que j'ai dû oublier.

124
FrVaBe

Vous pouvez utiliser @TestPropertySource pour remplacer les valeurs dans application.properties. De son javadoc:

les sources de propriétés de test peuvent être utilisées pour remplacer sélectivement les propriétés définies dans les sources de propriétés système et d'application.

Par exemple:

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

}
215
Andy Wilkinson

Vous pouvez également utiliser méta-annotations pour externaliser la configuration. Par exemple:

@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 { }
49
Rob Winch

Spring Boot charge automatiquement src/test/resources/application.properties, si les annotations suivantes sont utilisées

@RunWith(SpringRunner.class)
@SpringBootTest

Donc, renommez test.properties en application.properties pour utiliser la configuration automatique. 

Si vous * uniquement * devez charger le fichier de propriétés (dans l'environnement), vous pouvez également utiliser les éléments suivants, comme expliqué ici

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

[Update: remplacement de certaines propriétés pour le test

  1. Ajoutez src/main/resources/application-test.properties.
  2. Annotez la classe de test avec @ActiveProfiles("test").

Cela charge les propriétés application.properties et thenapplication-test.properties dans le contexte d'application du cas de test, conformément aux règles définies ici

Démo - https://github.com/mohnish82/so-spring-boot-testprops } _

37
Mohnish

Une autre approche appropriée pour remplacer quelques propriétés dans votre test, si vous utilisez l'annotation @SpringBootTest:

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

TLDR:

Donc, ce qui est fait était d'avoir le src/main/resources/application.properties standard et aussi un src/test/resources/application-default.properties où je remplace certains paramètres pour TOUS mes tests.

Histoire entière

J'ai rencontré le même problème et je n'utilisais pas de profils non plus. Cela semblait gênant de devoir le faire maintenant et de vous souvenir d'avoir déclaré le profil - ce qui peut facilement être oublié.

L'astuce consiste à tirer parti du fait qu'un application-<profile>.properties spécifique au profil remplace les paramètres du profil général. voir https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-specific-properties

1
elonderin

Sinon, nous pouvons changer le nom du configurateur de propriété par défaut, en définissant la propriété spring.config.name=test, puis en ayant la ressource de chemin de classe src/test/test.properties notre instance native de org.springframework.boot.SpringApplication sera configurée automatiquement à partir de ce test.properties séparé, en ignorant les propriétés de l'application;

Avantage: configuration automatique des tests;

Inconvénient: exposer la propriété "spring.config.name" au CI. couche

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

spring.config.name = application # nom du fichier de configuration

1
D. Soloviev

Vous pouvez également créer un fichier application.properties dans src/test/resources où vos JUnits sont écrits. 

0
PragmaticFire