Tengo un fragmento de código Java que utiliza una variable de entorno y el comportamiento del código depende del valor de esta variable. Me gustaría probar este código con diferentes valores de la variable de entorno. ¿Cómo puedo hacer esto en JUnit?
He visto algunas formas de establecer variables de entorno en Java en general, pero estoy más interesado en el aspecto de las pruebas unitarias, especialmente teniendo en cuenta que las pruebas no deberían interferir entre sí.
Respuestas:
Las reglas del sistema de la biblioteca proporcionan una regla JUnit para establecer variables de entorno.
Descargo de responsabilidad: soy el autor de las Reglas del sistema.
fuente
import org.junit.contrib.java.lang.system.EnvironmentVariables;
Deberá agregar la dependenciacom.github.stefanbirkner:system-rules
en su proyecto. Está disponible en MavenCentral.La solución habitual es crear una clase que gestione el acceso a esta variable ambiental, que luego puede burlarse en su clase de prueba.
La clase bajo prueba obtiene la variable de entorno utilizando la clase de entorno, no directamente de System.getenv ().
fuente
En una situación similar como esta en la que tuve que escribir Test Case que depende de la variable de entorno , intenté lo siguiente:
Perdí un día usando los dos enfoques anteriores, pero fue en vano. Entonces Maven vino a mi rescate. Podemos establecer variables de entorno o propiedades del sistema a través de archivo POM de Maven , que creo que es la mejor manera de hacer pruebas unitarias para proyectos basados en Maven . A continuación se muestra la entrada que hice en el archivo POM .
Después de este cambio, ejecuté Test Cases nuevamente y de repente todo funcionó como se esperaba. Para información del lector, exploré este enfoque en Maven 3.x , así que no tengo idea sobre Maven 2.x .
fuente
Creo que la forma más limpia de hacerlo es con Mockito.spy (). Es un poco más liviano que crear una clase separada para burlarse y pasar.
Mueva su recuperación de variables de entorno a otro método:
Ahora en su prueba de unidad haga esto:
fuente
No creo que esto se haya mencionado todavía, pero también podrías usar Powermockito :
Dado:
Podrías hacer lo siguiente:
fuente
when(System.getenv("FOO_VAR_1")).thenReturn("test-foo-var-1")
causaorg.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'.
errorDesacoplar el código Java de la variable de entorno proporcionando un lector de variables más abstracto del que se da cuenta con un entorno VariableReader de su código para probar las lecturas.
Luego, en su prueba, puede dar una implementación diferente del lector de variables que proporciona sus valores de prueba.
La inyección de dependencia puede ayudar en esto.
fuente
Esta respuesta a la pregunta ¿Cómo configuro las variables de entorno de Java? proporciona una forma de alterar el mapa (no modificable) en System.getenv (). Entonces, aunque REALMENTE no cambia el valor de la variable de entorno del sistema operativo, puede usarse para pruebas unitarias, ya que cambia lo que devolverá System.getenv .
fuente
Espero que el problema esté resuelto. Solo pensé en decirle mi solución.
fuente
Aunque creo que esta respuesta es la mejor para los proyectos de Maven, también se puede lograr a través de reflexionar (probado en Java 8 ):
fuente
theCaseInsensitiveEnvironment
y en su lugar tiene un campotheEnvironment
, como el siguiente: `` `envMap = new HashMap <> (); Clase <?> Clazz = Class.forName ("java.lang.ProcessEnvironment"); Campo theEnvironmentField = clazz.getDeclaredField ("theEnvironment"); Campo theUnmodifiableEnvironmentField = clazz.getDeclaredField ("theUnmodifiableEnvironment"); removeStaticFinalAndSetValue (theEnvironmentField, envMap); removeStaticFinalAndSetValue (theUnmodifiableEnvironmentField, envMap); `` `Bueno, puedes usar el método setup () para declarar los diferentes valores de tu env. variables en constantes. Luego use estas constantes en los métodos de prueba utilizados para probar los diferentes escenarios.
fuente
Si desea recuperar información acerca de la variable de entorno de Java, se puede llamar al método:
System.getenv();
. Como propiedades, este método devuelve un Mapa que contiene los nombres de las variables como claves y los valores de las variables como los valores del mapa. Aquí hay un ejemplo :El método
getEnv()
también puede tomar un argumento. Por ejemplo :Para probar, haría algo como esto:
fuente
Uso System.getEnv () para obtener el mapa y lo guardo como un campo, para poder burlarme de él:
fuente