Ersetzen von Systemumgebungsvariablen durch Reflektion in Java

Beim Schreiben von Testcode in jUnit etc.

System.Möglicherweise möchten Sie den Wert der Systemumgebungsvariablen, die Sie erhalten, vorübergehend durch getenv ersetzen.



 Es werden zwei Implementierungen beschrieben, von denen eine keine Bibliothek und die andere PowerMock verwendet.

 Dependency
Java 8 
 * Ich denke, es wird mit Java 7 funktionieren.

# Implementierung ohne Bibliothek
 Die Systemumgebungsvariable `` `TMEP``` wurde ersetzt.

```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 {
	//Holen Sie sich Final Class-Methoden und machen Sie sie zugänglich
	Class<?> clazz = Class.forName("java.lang.ProcessEnvironment");
    Field theCaseInsensitiveEnvironment = clazz.getDeclaredField("theCaseInsensitiveEnvironment");
	theCaseInsensitiveEnvironment.setAccessible(true);

	//Ersetzen Sie nur die Systemumgebungsvariablen, die Sie benötigen
	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 ist relativ einfach zu implementieren. Die Klasse muss jedoch mit Anmerkungen versehen werden.

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");
  }
}

Bemerkungen

Der Beispielquellcode ist unten. https://github.com/amanoese/java-reflection-sample

Der Prozess war im Quellcode der Systemregeln ähnlich, daher ist dies im Grunde genommen in Ordnung. https://github.com/stefanbirkner/system-rules/blob/master/src/main/java/org/junit/contrib/java/lang/system/EnvironmentVariables.java#L165-L190

Referenz

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

Ersetzen von Systemumgebungsvariablen durch Reflektion in Java
Behandeln Sie Systemumgebungsvariablen in Spring application.properties
Wenn Java-Tests Umgebungsvariablen enthalten
JavaFX-Umgebungskonstruktion in Java 13
Java Spring-Umgebung in vs Code
So benennen Sie Variablen in Java
Festlegen von Projektumgebungsvariablen mit IntelliJ
Untersuchen Sie die Systeminformationen der AWS Lambda-Betriebsumgebung in Java
Leistungseinbußen bei Java-Containern in der Menicoa-Umgebung
Doppelte Karte sortiert nach Schlüssel in Java
[Docker] Verwenden Sie Umgebungsvariablen in Nginx conf
Verwendung von Umgebungsvariablen in RubyOnRails
Deklarieren Sie keine Variablen in List in Java
In einer VM-Umgebung erstellte Java-Anwendungsentwicklungsumgebung
Verketten von durch Kommas getrennten Zeichenfolgen mit StringJoiner auch in einer Java7-Umgebung
[Java] Dynamischer Methodenaufruf durch Reflektion des Aufzählungstyps (Aufzählung)
Lösung für NetBeans 8.2 funktioniert nicht in Java 9-Umgebung
Was ich in Java gelernt habe (Teil 2) Was sind Variablen?
Bibliothek "OSHI" zum Erfassen von Systeminformationen mit Java
Punkte, die beim Erstellen der VS Code- und Java-Entwicklungsumgebung hängen bleiben
[Java] Ausgabe, Variablen
Partisierung in Java
[Java] Umgebungskonstruktion
Änderungen in Java 11
Janken in Java
[WIP] Java-Variablen
Umfangsrate in Java
FizzBuzz in Java
[LeJOS] Programmieren wir mindstorm-EV3 mit Java [Umgebungskonstruktion Teil 2]
Aufrufen von Funktionen in großen Mengen mit Java Reflection
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
Lesen Sie die Paketerfassung, die von tcpdump mit Java erhalten wurde
Maven schlägt in der Java7-Umgebung fehl (schwerwiegende Warnung erhalten: protocol_version)
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
[Java] Verweisen Sie auf und setzen Sie private Variablen mit Reflektion
[Java] Holen Sie sich die Datei unabhängig von der Umgebung in das JAR
[JAVA] [Spring] [MyBatis] Verwenden Sie GROUP BY in SQL Builder
Unterschiede im Code bei Verwendung des Längensystems in Java