Remplacer l'application Spring-Boot par défaut.paramètres de propriétés dans le test Junit

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

Je voudrais remplacer certains paramètres par défaut dans mon test JUnit avec des propriétés déclarées dans un fichier test.properties (src / test / resources / test.les propriétés)

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é que l'utilisation de @PropertySource("classpath:test.properties") dans la classe TestConfig ferait l'affaire, mais ceux-ci les propriétés n'écraseront pas l'application.paramètres de propriétés (voir Référence Spring-Boot Doc - 23. Configuration Externalisée ).

, Puis 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. Ainsi je l'ai mis dans le code

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

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

}

Ce qui malheureusement n'a pas encore réussi.

Il doit y avoir une solution simple sur la façon de remplacer les paramètres application.properties dans les tests JUnit avec {[3] } que je doit être négligé.

104
demandé sur Rufi 2015-04-16 11:32:52

5 réponses

Vous pouvez utiliser @TestPropertySource pour remplacer des 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 application

Par exemple:

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

}
184
répondu Andy Wilkinson 2015-04-16 11:45:13

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 { }
47
répondu Rob Winch 2018-07-27 06:52:53

Printemps de Démarrage charge automatiquement src/test/resources/application.properties, si les annotations suivantes sont utilisées

@RunWith(SpringRunner.class)
@SpringBootTest

, renommez test.properties à application.properties pour utiliser la configuration automatique.

{Si vous[15]}*seulement* devez charger le fichier de propriétés (dans l'Environnement) peut aussi utiliser, comme expliqué ici

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

[mise à jour: remplacement de certaines propriétés pour tester ]

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

Cette charge application.properties et , puis application-test.properties propriétés dans le contexte de l'application pour le cas de test, selon les règles définies ici.

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

27
répondu Mohnish 2018-07-12 07:20:59

Sinon, nous pouvons changer le nom du configurateur de propriétés par défaut, en définissant la propriété spring.config.name=test, puis en ayant une 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 séparé.propriétés, ignorant les propriétés de l'application;

Avantage: configuration automatique des tests;

Inconvénient: exposer "spring.config.name" propriété à C. I. layer

Réf: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

Spring. config. name=Nom du fichier de configuration de l'application #

0
répondu D. Soloviev 2016-11-09 18:51:56

TLDR:

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

Toute L'Histoire

J'ai rencontré le même problème et n'utilisait pas non plus de profils jusqu'à présent. Il semblait être gênant d'avoir à le faire maintenant et n'oubliez pas de déclarer le profil, qui peut être facilement oublié.

L'astuce consiste à tirer parti du fait qu'un profil spécifique application-<profile>.properties 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-properties

0
répondu elonderin 2018-08-08 08:13:55