web-dev-qa-db-fra.com

Charger autre application.yml dans Spring Boot Test

J'utilise une application de démarrage de printemps qui exécute mon répertoire src/main/resources/config/application.yml.

Quand je lance mon cas de test par:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class MyIntTest{
}

Les codes de test continuent d'exécuter mon fichier application.yml pour charger les propriétés ... Je me demande s'il est possible d'exécuter un autre fichier * .yml lors de l'exécution du scénario de test.

33
Exia

Une option consiste à travailler avec des profils. Créez un fichier appelé application-test.yml , déplacez toutes les propriétés nécessaires à ces tests dans ce fichier, puis ajoutez l'annotation @ActiveProfiles à votre classe de test:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@ActiveProfiles("test") // Like this
public class MyIntTest{
}

Sachez que cela chargera en outre le fichier application-test.yml. Par conséquent, toutes les propriétés figurant dans le fichier application.yml seront également appliquées. Si vous ne le souhaitez pas, utilisez également un profil pour ceux-ci ou remplacez-le dans votre application-test.yml.

43
g00glen00b

Vous pouvez utiliser@TestPropertySourcepour charger différentes propriétés/fichier yaml

@TestPropertySource(locations="classpath:test.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class MyIntTest{

}

OU si vous voulez remplacer uniquement des propriétés spécifiques/yaml, vous pouvez utiliser

@TestPropertySource(
        properties = {
                "spring.jpa.hibernate.ddl-auto=validate",
                "liquibase.enabled=false"
        }
)
14
Aman Tuladhar

Vous pouvez définir vos propriétés de test dans le fichier src/test/resources/config/application.yml. Les cas de test Spring Boot prendront les propriétés du fichier application.yml dans le répertoire test .

12
TheKojuEffect

Voir ceci: Spring @PropertySource utilisant YAML

Je pense que la 3ème réponse a ce que vous cherchez, c’est-à-dire un POJO séparé pour mapper vos valeurs yaml dans: 

@ConfigurationProperties(path="classpath:/appprops.yml", name="db")
public class DbProperties {
    private String url;
    private String username;
    private String password;
...
}

Puis annotez votre classe de test avec ceci:

@EnableConfigurationProperties(DbProperties.class)
public class PropertiesUsingService {

    @Autowired private DbProperties dbProperties;

}
4
Pete

Si vous avez besoin que la production application.yml soit complètement remplacée, placez sa version de test sur le même chemin, mais dans un environnement de test (généralement src/test/resources/)

Mais si vous devez remplacer ou ajouter des propriétés, vous avez peu d'options.

Option 1: placez test application.yml dans le répertoire src/test/resources/config/ comme le suggère @TheKojuEffect dans son answer .

Option 2: utilisez propriétés spécifiques au profil : create say application-test.yml dans votre dossier src/test/resources/ et:

  • ajoutez une annotation @ActiveProfiles à vos classes de test:

    @SpringBootTest(classes = Application.class)
    @ActiveProfiles("test")
    public class MyIntTest {
    
  • ou bien définissez la valeur de la propriété spring.profiles.active dans l'annotation @SpringBootTest:

    @SpringBootTest(
            properties = ["spring.profiles.active=test"],
            classes = Application.class,
    )
    public class MyIntTest {
    

Cela fonctionne non seulement avec @SpringBootTest mais également avec @JsonTest, @JdbcTests, @DataJpaTest et d'autres annotations de test de tranche.

Et vous pouvez définir autant de profils que vous le souhaitez (spring.profiles.active=dev,hsqldb) - voir plus de détails dans la documentation sur Profils .

3
Lu55

L'infrastructure Spring-Boot nous permet de fournir des fichiers YAML en remplacement du fichier .properties, ce qui est pratique. Les clés des fichiers de propriétés peuvent être fournies au format YAML dans le fichier application.yml du dossier de ressources. Spring-Boot prend automatiquement Gardez à l'esprit que le format yaml doit conserver les espaces corrects pour que la valeur soit lue correctement.

Vous pouvez utiliser @Value ("$ {property}") pour injecter les valeurs des fichiers YAML . Vous pouvez également spécifier Spring.active.profiles, afin de différencier les différents YAML de différents environnements afin de faciliter leur déploiement.

À des fins de test, le fichier test yaml peut être nommé comme application-test.yml et placé dans le dossier de ressources du répertoire de test.

Voici le lien vers la documentation de Spring concernant l’utilisation de YAML au lieu du .properties fichier (s): https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config .html

1
Ananthu

Depuis Spring 4.1, nous pouvons directement définir la propriété dans application.yml à l’aide de @TestPropertySource annotation. 

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = {"yoursection.yourparameter=your_value"})
public MyIntTest
{
 //your test methods
}

Il suffit de convertir vos paramètres yaml en une structure de propriété complète. Par exemple: Si le contenu de application.yml est comme ci-dessous

yoursection:
  yourparameter:your_value

Alors la valeur pour aller dans le @TestPropertySource sera, 

yoursection.yourparameter=your_value
1
Great Giri

Nous pouvons utiliser l'annotation @SpringBootTest qui charge le fichier yml à partir de src\main\Java\com ... par conséquent, lorsque nous exécutons le test unitaire, toutes les propriétés sont déjà présentes dans la classe de propriétés config.

@RunWith(SpringRunner.class)
@SpringBootTest
public class AddressFieldsTest {

    @InjectMocks
    AddressFieldsValidator addressFieldsValidator;

    @Autowired
    AddressFieldsConfig addressFieldsConfig;
    ...........

    @Before
    public void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(addressFieldsValidator,"addressFieldsConfig", addressFieldsConfig);
    }

}

Nous pouvons utiliser l'annotation @Value si vous avez peu de configurations ou si vous pouvez utiliser une classe de propriétés de configuration. Par exemple

@Data
@Component
@RefreshScope
@ConfigurationProperties(prefix = "address.fields.regex")
public class AddressFieldsConfig {

    private int firstName;
    private int lastName;
    .........
0
denzal