Pergunta

O que eu tenho agora

Eu tenho uma instância de 3ª festa em que minha classe em teste depende e que Singleton está usando System.getenv(String) em seu construtor. É possível zombar desta chamada?

Eu tentei isso

Exemplo jmockit

    new Expectations()
    {

        System mockedSystem;
        {
            System.getenv( "FISSK_CONFIG_HOME" ); returns( "." );
        }
    };

Mas isso me dá um EXCEPTION_ACCESS_VIOLATION e trava a JVM.

Existe outra maneira de definir uma variável de ambiente do sistema para um teste de unidade?

Foi útil?

Solução

Nesse caso, você precisa usar zombarias parciais para que o JMOCKIT não redefina tudo na classe do sistema. O teste a seguir passará:

   @Test
   public void mockSystemGetenvMethod()
   {
      new Expectations()
      {
         @Mocked("getenv") System mockedSystem;

         {
            System.getenv("envVar"); returns(".");
         }
      };

      assertEquals(".", System.getenv("envVar"));
   }

Em breve, implementarei um aprimoramento para que problemas como esse não ocorram ao zombar das aulas do JRE. Deve estar disponível na versão 0.992 ou 0,993.

Outras dicas

Powermock costuras para poder zombar das classes do sistema.

Sua outra opção (assumindo que você não está testando a unidade da API da terceira parte) é criar um para Fachada A API de terceiros que possui uma interface simulável e fácil e fácil e faz com que suas aulas de teste usem isso e não a coisa real.

Ah, o JMOCKIT também suporta isto: pacote Playtest;

import static org.junit.Assert.*;

import mockit.*;
import mockit.integration.junit4.JMockit;

import org.junit.*;
import org.junit.runner.RunWith;

@RunWith(JMockit.class)
public class JMockItTest {

 @Test
 public void mockSystemGetEnv() {
  Mockit.setUpMocks(MockSystem.class); 

  assertEquals("Bye", System.getenv("Hello"));

 }

 @MockClass(realClass = System.class)
 public static class MockSystem {
  @Mock
  public static String getenv(String str) {
   return "Bye";
  }
 }

}

Você não pode mudar o ambiente, mas pode alterar o acesso a ele: basta embrulhar a chamada para System.getenv() em um método ou classe auxiliar e depois zombe disso.

Editar] Agora, seu problema é como alterar o código da sua biblioteca de terceiros. A solução aqui é usar um decompilador Java e corrigir a classe. Se você quiser, também pode enviar uma solicitação de recurso. Adicione essa nova classe ao seu conjunto de testes. Isso deve fazer com que seu IDE encontre a classe para os testes.

Como o código de teste não entra em produção, você pode executar seus testes e o código de produção usará a biblioteca original.

Um tempo atrás, eu queria Sistema de teste.Exit, e encontrou uma solução usando um SecurityManager personalizado. Você pode verificar se a chamada está sendo feita e o argumento da chamada, mas usando esse método, não pode zombar do valor de retorno da chamada.

Uma atualização sobre a resposta @Rogétio.

No meu caso, com o jmockit 1.25, tive que fazer isso usando a API de maquete:

@Test
public void mockSystemGetenvMethod(){
    new MockUp<System>()
    {
        @Mock
        public String getenv(final String string) {
            return "";
        }
    };

    assertEquals(".", System.getenv("envVar"));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top