문제

내가 지금 가지고있는 것

테스트중인 내 수업에 의존하고 싱글 톤이 사용하는 제 3 자 싱글 톤 인스턴스가 System.getenv(String) 생성자에. 이 전화를 조롱 할 수 있습니까?

나는 이것을 시도했다

jmockit 예

    new Expectations()
    {

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

그러나 그것은 나에게 준다 EXCEPTION_ACCESS_VIOLATION JVM을 충돌시킵니다.

단위 테스트를 위해 시스템 환경 변수를 설정하는 또 다른 방법이 있습니까?

도움이 되었습니까?

해결책

이 경우 jmockit이 시스템 클래스의 모든 것을 재정의하지 않도록 부분 조롱을 사용해야합니다. 다음 테스트는 다음과 같습니다.

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

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

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

JRE 클래스를 조롱 할 때 이와 같은 문제가 발생하지 않도록 곧 향상을 구현할 것입니다. 릴리스 0.992 또는 0.993에서 사용할 수 있어야합니다.

다른 팁

PowerMock 시스템 클래스를 조롱 할 수있는 이음새.

다른 옵션 (제 3 자 API를 테스트하지 않는다고 가정)은 A를 작성하는 것입니다. 정면 멋지고 쉬운 조롱 가능한 인터페이스를 가지고 있으며 테스트 클래스가 실제보다는이를 사용하도록하는 제 3 자 API.

오, jmockit도 이것도 지원합니다 : 패키지 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";
  }
 }

}

환경을 변경할 수는 없지만 액세스를 변경할 수 있습니다. System.getenv() 방법이나 도우미 클래스에서 조롱합니다.

편집] 이제 문제는 제 3 자 라이브러리의 코드를 변경하는 방법입니다. 여기서 해결책은 Java 디 컴파일러를 사용하고 클래스를 수정하는 것입니다. 원한다면 기능 요청도 보낼 수도 있습니다. 새로운 클래스를 테스트 스위트에 추가하십시오. 그것은 당신의 IDE가 테스트를위한 수업을 찾게해야합니다.

테스트 코드가 제작에 들어 가지 않기 때문에 테스트를 실행할 수 있으며 프로덕션 코드는 원래 라이브러리를 사용합니다.

얼마 전 나는하고 싶었습니다 테스트 시스템 .exit, a를 사용하여 솔루션을 찾았습니다 사용자 정의 보안 관리자. 통화가 이루어 졌는지 확인하고 통화의 인수를 확인할 수 있지만이 방법을 사용하면 통화의 반환 값을 조롱 할 수 없습니다.

@rogério 답변에 대한 업데이트.

제 경우에는 jmockit 1.25의 경우 Mockup API를 사용하여 수행해야했습니다.

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

    assertEquals(".", System.getenv("envVar"));
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top