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.
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.
Vous pouvez utiliser@TestPropertySource
pour 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"
}
)
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 .
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;
}
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 .
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
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
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;
.........