Les suggestions ci-dessus mettent beaucoup l'accent sur l'invention de solutions. en cours d'exécution pour passer des variables, les définir et les effacer, etc ? Mais pour tester les choses "structurellement", je suppose que vous voulez avoir différentes suites de tests pour différents scénarios ? C'est un peu comme lorsque vous voulez exécuter vos tests d'intégration les plus lourds, alors que dans la plupart des cas, vous voulez simplement les ignorer. Mais alors vous n'essayez pas "d'inventer des façons de régler les choses en cours d'exécution", plutôt vous vous contentez de dire maven ce que vous voulez ? Il y avait beaucoup de travail pour dire à maven d'exécuter des tests spécifiques via des profils et autres, si vous cherchez sur Google, les gens suggèrent de le faire via springboot (mais si vous n'avez pas intégré le monstrum springboot dans votre projet, cela semble être une empreinte horrible pour "juste exécuter JUnits", n'est-ce pas ?) Ou bien cela impliquerait des tas de jongleries XML POM plus ou moins gênantes, ce qui est également fastidieux et, disons-le, "un mouvement des années 90", aussi gênant que d'insister encore pour faire des "spring beans à partir de XML", en montrant vos "spring beans". ultime 600 ligne logback.xml ou autre... ?
Aujourd'hui, vous pouvez simplement utiliser Junit 5 (cet exemple est pour maven, plus de détails peuvent être trouvés ici). Guide d'utilisation de JUnit 5 5 )
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
et ensuite
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
puis, dans votre librairie utilitaire préférée, créez une classe d'annotation simple et astucieuse telle que
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@EnabledIfEnvironmentVariable(named = "MAVEN_CMD_LINE_ARGS", matches = "(.*)integration-testing(.*)")
public @interface IntegrationTest {}
Ainsi, chaque fois que vos options cmdline contiennent -Pintegration-testing par exemple, alors et seulement alors votre classe/méthode de test annotée @IntegrationTest se déclenchera. Ou, si vous ne voulez pas utiliser (et configurer) un profil maven spécifique mais plutôt passer des propriétés de système 'trigger' au moyen de la commande
mvn <cmds> -DmySystemPop=mySystemPropValue
et adapter votre interface d'annotation pour la déclencher (oui, il existe aussi une propriété @EnabledIfSystemProperty). Vous pouvez aussi vous assurer que votre shell est configuré pour contenir "ce dont vous avez besoin" ou, comme suggéré plus haut, vous pouvez vous donner la peine d'ajouter system env via votre POM XML.
Avoir son code à l'intérieur En effet, il est facile d'imaginer que quelqu'un fera tôt ou tard une erreur interne "cachée" qui passera inaperçue pendant un certain temps, pour surgir soudainement et vous mordre de plein fouet dans la production plus tard . Vous préférez généralement une approche qui implique qu'une "entrée donnée" donne une "sortie attendue", quelque chose qui est facile à comprendre et à maintenir dans le temps, vos collègues codeurs le verront simplement "immédiatement".
Bien longue "réponse" ou peut-être plutôt une simple opinion sur les raisons pour lesquelles vous préférez cette approche (oui, au début j'ai juste lu le titre de cette question et je me suis lancé pour y répondre, c'est-à-dire "Comment tester du code dépendant de variables d'environnement à l'aide de JUnit").