2016-08-03 3 views
0

테스트 클래스를 별도로 실행하면 모든 것이 잘되고 초록색입니다. 그러나 Intellij에서 테스트를 모두 실행하면 일부 테스트가 실패합니다.Fail JMockit 테스트

@RunWith(JMockit.class) 
public class Test2 { 

    @Before 
    public void setUp() throws Exception { 

    } 

    @Test 
    public void test_real_test_method() throws Exception { 

     assertThat(TestSut.test()).isEqualTo("test"); 
    } 

} 

확실히 그 Test1합니다

@RunWith(JMockit.class) 
public class Test1 { 

    @Mocked(stubOutClassInitialization = true) 
    TestSut test; 

    @Before 
    public void setUp() throws Exception { 

    } 

    @Test public void test_mocked_test_method() throws Exception { 

     new Expectations() {{ 
      TestSut.test(); 
      result = "new Test"; 
     }}; 

     assertThat(TestSut.test()).isEqualTo("new Test"); 
    } 
} 

이 두 번째 테스트는 다음과 같습니다

public class TestSut { 

    public static String test = "test"; 

    public static String test() { 
     return test; 
    } 

} 

이 첫 번째 테스트는 다음과 같습니다

는 다음 코드와 그 동작을 재현 함께 테스트를 실행할 때 Test2 이전에 실행됩니다.

JMockit이 클래스를 다시 작성한 후에 TestSut 클래스가 다시로드되지 않는다고 생각합니다.

Ideas test exec engine의 버그입니까? 다른 아이디어?

현재 : maven으로 테스트를 실행하면 모든 것이 매력처럼 작동합니다.

답변

1

이것은 버그가 아닙니다. @Mocked(stubOutClassInitialization = true)의 사용으로 인해 발생하는 행동은 내가 아래 재생 관련 API documentation에 설명되어 있습니다 :

는 조롱 클래스의 정적 초기화 코드가 밖으로 스텁 여부를할지 여부를 나타냅니다. 정적 초기화에는 클래스의 정적 필드에 대한 할당 실행과 정적 초기화 블록 (있는 경우) 실행이 포함됩니다.

기본적으로 조롱 된 클래스의 정적 초기화 코드는 스텁 아웃되지 않습니다. JVM은 클래스의 정적 초기화 만 수행하므로 초기화 코드를 스텁 아웃하면 예기치 않은 결과가 발생할 수 있습니다. 정적 초기화는 클래스가 처음 인스턴스화 될 때 발생하거나 정적 메소드가 호출되거나 런타임에 정의 된 값이 정적 필드를 액세스 할 때 발생합니다. 이것들은 클래스를 초기화하기 위해 JVM에게 프롬프트하는 유일한 이벤트입니다. 원래의 클래스 초기화 코드가 스텁 아웃 된 경우 정적 초기화시 실행되지 않아 잠재적으로 정적 필드를 null로 남겨두고 나중에 NullPointerException을 발생시킵니다.