2017-04-13 11 views
0

아래의 단순화 된 JUnit 테스트를 실행하면 성공하지만 오류 메시지가 표시됩니다. 모든 테스트 인스턴스가 생성되면 알림이 지원되지 않습니다. 먼저! 나는 @PowerMockRunnerDelegate(BlockJUnit4ClassRunner.class), 또는 extends TestB 또는 @PrepareForTest({ A.class })를 제거하면Powermock : 모든 테스트 인스턴스가 처음 생성 될 때 알림이 지원되지 않습니다.

@RunWith(PowerMockRunner.class) 
@PowerMockRunnerDelegate(BlockJUnit4ClassRunner.class) 
@PrepareForTest({ A.class }) 
public class TestA extends TestB { 
    @Test 
    public void test() throws Exception { 
     assertEquals(true, true); 
    } 
} 

public class TestB {} 
public class A {} 

메시지가 사라집니다. 심지어 emtpy @PrepareForTest({ }) 오류 메시지가 나타납니다.

나는이 post을 발견했으나, 확장 된 BlockJUnit4ClassRunner을 사용하고 있지 않기 때문에 같은 문제는 아닙니다.

이 오류 메시지가 나타나는 이유를 이해하려고합니다.

Powermock (1.6.6) 및 JUnit 4.12의 최신 버전을 사용하고 java8을 사용하여 테스트를 실행 중입니다.

답변

1

PowerMock은 jUnit 이벤트 메시지를 확장하고 테스트 생명 서클 동안 추가 이벤트를 발생시킵니다. PowerMockTestListener은 모든 jUnit 및 추가 PowerMock 이벤트를 수신하는 데 사용할 수 있습니다.

이 이벤트 중 하나는 테스트 당 인스턴스가 생성되어야합니다. jUnit 러너는 일반적으로 클래스의 각 테스트 메소드마다 테스트 클래스의 새 인스턴스를 생성하지만 일부 인스턴스는 모든 테스트에 대해 클래스의 인스턴스를 하나만 만들 수 있습니다. @PowerMockRunnerDelegate이 사용되면 테스트 인스턴스를 생성하는 위임 된 러너가 사용됩니다.

"test created"없이 "test start"이벤트가 발생하면 PowerMock은 테스트가 시작되기 전에 모든 테스트 인스턴스가 생성되어 내부 이벤트를 실행할 수 없음을 감지하고이 메시지를 system.err에 출력합니다. 따라서 게시글에 설명 된 것과 동일한 문제가 있습니다.

PowerMock에는 현재 PowerMockTestListener 구현 - AnnotationEnabler 만 있습니다. 이 구현은 EasyMock 및 Mockito와 통합하고 @TestSubject, @Mock 등과 같은 주석을 지원하는 데 사용됩니다. 결과적으로 콘솔에서이 메시지가 표시되는 것은이 기능이 제대로 작동하지 않는다는 것을 의미합니다. 그러나 Mockito 케이스의 경우 MockitoAnnotations.initMocks(this)을 사용하면 더 쉽게 고정 될 수 있습니다.

매우 재미있어서 'extends TestB'를 제거하면 메시지가 사라집니다. 나는이 사건을 조사하고 그것이 일어나는 이유를 조사 할 것이다.