Eu tenho um pedaço de código Java que usa uma variável de ambiente e o comportamento do código depende do valor dessa variável. Eu gostaria de testar esse código com diferentes valores da variável de ambiente. Como posso fazer isso no JUnit?
Eu já vi algumas maneiras de definir variáveis de ambiente em Java em geral, mas estou mais interessado no aspecto do teste de unidade, especialmente considerando que os testes não devem interferir um com o outro.
Respostas:
A biblioteca System Rules fornece uma regra JUnit para definir variáveis de ambiente.
Isenção de responsabilidade: sou o autor das Regras do sistema.
fonte
import org.junit.contrib.java.lang.system.EnvironmentVariables;
Você precisará adicionar a dependênciacom.github.stefanbirkner:system-rules
no seu projeto. Está disponível no MavenCentral.A solução usual é criar uma classe que gerencia o acesso a essa variável ambiental, que você pode zombar na sua classe de teste.
A classe em teste obtém a variável de ambiente usando a classe Environment, não diretamente de System.getenv ().
fonte
Em uma situação semelhante à essa, em que tive que escrever um caso de teste que depende da variável de ambiente , tentei o seguinte:
Perdi um dia usando as duas abordagens acima, mas sem sucesso. Então Maven veio em meu socorro. Podemos definir variáveis de ambiente ou propriedades do sistema através do arquivo POM do Maven, que acho a melhor maneira de fazer o teste de unidade para o projeto baseado no Maven . Abaixo está a entrada que fiz no arquivo POM .
Após essa alteração, executei os Casos de Teste novamente e, de repente, todos funcionaram conforme o esperado. Para obter informações do leitor, eu explorei essa abordagem em Maven 3.x , então eu não tenho idéia sobre Maven 2.x .
fonte
Eu acho que a maneira mais limpa de fazer isso é com o Mockito.spy (). É um pouco mais leve do que criar uma classe separada para zombar e repassar.
Mova sua variável de ambiente buscando para outro método:
Agora, no seu teste de unidade, faça o seguinte:
fonte
Acho que isso não foi mencionado ainda, mas você também pode usar o Powermockito :
Dado:
Você pode fazer o seguinte:
fonte
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'.
erroDesacoplar o código Java da variável Environment, fornecendo um leitor de variáveis mais abstrato que você percebe com um EnvironmentVariableReader do seu código para testar leituras.
Em seu teste, você pode fornecer uma implementação diferente do leitor de variáveis que fornece seus valores de teste.
A injeção de dependência pode ajudar nisso.
fonte
Esta resposta à pergunta Como faço para definir variáveis de ambiente do Java? fornece uma maneira de alterar o mapa (não modificável) em System.getenv (). Portanto, embora não altere REALMENTE o valor da variável de ambiente do SO, ela pode ser usada para testes de unidade, pois altera o que System.getenv retornará.
fonte
Espero que o problema seja resolvido. Eu apenas pensei em dizer a minha solução.
fonte
Embora eu ache que essa resposta é a melhor para projetos do Maven, ela também pode ser alcançada via reflect (testada em Java 8 ):
fonte
theCaseInsensitiveEnvironment
e, em vez disso, possui um campotheEnvironment
, como o seguinte: `` `envMap = new HashMap <> (); Classe <?> Clazz = Class.forName ("java.lang.ProcessEnvironment"); Campo theEnvironmentField = clazz.getDeclaredField ("theEnvironment"); Campo theUnmodifiableEnvironmentField = clazz.getDeclaredField ("theUnmodifiableEnvironment"); removeStaticFinalAndSetValue (theEnvironmentField, envMap); removeStaticFinalAndSetValue (theUnmodifiableEnvironmentField, envMap); ``Bem, você pode usar o método setup () para declarar os diferentes valores do seu ambiente. variáveis em constantes. Em seguida, use essas constantes nos métodos de teste usados para testar o cenário diferente.
fonte
Se você deseja recuperar informações sobre a variável de ambiente em Java, você pode chamar o método:
System.getenv();
. Como as propriedades, esse método retorna um Mapa contendo os nomes das variáveis como chaves e os valores das variáveis como valores do mapa. Aqui está um exemplo :O método
getEnv()
também pode receber um argumento. Por exemplo :Para testar, eu faria algo assim:
fonte
Uso System.getEnv () para obter o mapa e mantenho-o como um campo, para que eu possa zombar dele:
fonte