Remplacement des variables d'environnement système par réflexion en Java

Lors de l'écriture de code de test dans jUnit, etc.

System.Vous souhaiterez peut-être remplacer temporairement la valeur de la variable d'environnement système que vous obtenez par getenv.



 Deux implémentations, l'une qui n'utilise pas de bibliothèque et l'autre qui utilise PowerMock, sont décrites.

 Dependency
Java 8 
 * Je pense que cela fonctionnera avec Java 7.

# Implémentation sans bibliothèque
 La variable d'environnement système `` TMEP '' a été remplacée.

```java
import org.junit.Test;

import java.lang.reflect.Modifier;
import java.lang.reflect.Field;
import java.util.Map;

import static org.junit.Assert.assertEquals;

public class EnvironmentTest {
  @Test
  public void replaceEnvironment() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
	//Obtenez des méthodes de classe finale et rendez-les accessibles
	Class<?> clazz = Class.forName("java.lang.ProcessEnvironment");
    Field theCaseInsensitiveEnvironment = clazz.getDeclaredField("theCaseInsensitiveEnvironment");
	theCaseInsensitiveEnvironment.setAccessible(true);

	//Remplacez uniquement les variables d'environnement système dont vous avez besoin
	Map<String,String> sytemEnviroment = (Map<String, String>) theCaseInsensitiveEnvironment.get(null);
    sytemEnviroment.put("TEMP","/MY_TEMP_DIR");

	assertEquals(System.getenv("TEMP"),"/MY_TEMP_DIR");
  }
}

PowerMock

PowerMock est relativement facile à mettre en œuvre. Cependant, la classe doit être annotée.

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ System.class })
public class EnvironmentWithPowerMockTest {
  @Test
  public void replaceEnvironment(){
	PowerMockito.mockStatic(System.class);
	PowerMockito.when(System.getenv("TEMP")).thenReturn("/MY_TEMP_DIR");

	assertEquals(System.getenv("TEMP"),"/MY_TEMP_DIR");
  }
}

Remarques

L'exemple de code source est ci-dessous. https://github.com/amanoese/java-reflection-sample

Le processus était similaire dans le code source des règles système, donc, fondamentalement, c'est correct. https://github.com/stefanbirkner/system-rules/blob/master/src/main/java/org/junit/contrib/java/lang/system/EnvironmentVariables.java#L165-L190

référence

https://qiita.com/5at00001040/items/83bd7ea85d0f545ae7c3 https://blogs.yahoo.co.jp/dk521123/37484564.html https://stackoverflow.com/questions/318239/how-do-i-set-environment-variables-from-java

Recommended Posts

Remplacement des variables d'environnement système par réflexion en Java
Gérer les variables d'environnement système dans Spring application.properties
Lorsqu'il y a des variables d'environnement dans les tests Java
Construction de l'environnement JavaFX dans Java 13
Environnement Java Spring dans vs Code
Comment nommer des variables en Java
Définition des variables d'environnement de projet avec intelliJ
Examiner les informations système de l'environnement d'exploitation AWS Lambda en Java
Dégradation des performances du conteneur Java dans l'environnement Menikoa
Carte en double triée par clé en Java
[Docker] Utiliser des variables d'environnement dans Nginx conf
Comment utiliser les variables d'environnement dans RubyOnRails
Ne déclarez pas de variables dans List en Java
Environnement de développement d'applications Java créé dans un environnement VM
Comment concaténer des chaînes séparées par des virgules à l'aide de StringJoiner même dans un environnement Java7
[Java] Appel de méthode dynamique par réflexion du type enum (enum)
La solution pour NetBeans 8.2 ne fonctionne pas dans l'environnement Java 9
Ce que j'ai appris en Java (partie 2) Que sont les variables?
Bibliothèque "OSHI" pour acquérir des informations système avec Java
Points bloqués dans la création d'un environnement de développement VS Code et Java
[Java] sortie, variables
Partition en Java
[Java] Construction de l'environnement
Changements dans Java 11
Janken à Java
[WIP] Variables Java
Taux circonférentiel à Java
FizzBuzz en Java
[LeJOS] Programmons mindstorm-EV3 avec Java [Construction de l'environnement partie 2]
Comment appeler des fonctions en bloc avec la réflexion Java
Comment créer un environnement Java en seulement 3 secondes
Lire la capture de paquets obtenue par tcpdump avec Java
Maven échoue dans l'environnement Java7 (alerte fatale reçue: version_protocole)
[Java] Différence entre statique final et final dans les variables membres
[Java] Se référer et définir des variables privées avec réflexion
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement
[JAVA] [Spring] [MyBatis] Utiliser GROUP BY dans SQL Builder
Différences de code lors de l'utilisation du système de longueur en Java