2017-01-27 3 views
0

몇 가지 테스트를 위해 PowerMockRunner가 필요하며 null이 아닌 정적 공개 필드를 사용하는 타사 라이브러리를 사용합니다.PowerMockRunner를 확장하고 공개 정적 필드를 설정하십시오.

이 작동 : 이제이 작동하지 않습니다

public class MyRunner extends PowerMockRunner { 
    public MyRunner(Class<?> klass) throws Exception { 
     super(klass); 
     SomeStaticClass.variable = mock(Variable.class); 
    } 
} 

:

@RunWith(PowerMockRunner.class) 
public class TestSomething {  

    private ClassToTest fixture;  

    @Before 
    public void setup() {  
     SomeStaticClass.variable = mock(Variable.class);    
     fixture = new ClassToTest();  
    } 

    @Test 
    public void create() {    
     System.out.println(SomeStaticClass.variable); // prints the mock 
     assertNotNull(SomeStaticClass.variable); // passes 
    } 
} 

그래서 나는이 같은 자신의 PowerMockRunner에 SomeStaticClass.variable = mock(Variable.class); 부분을 데려 가고 싶다는 결정

@RunWith(MyRunner.class) 
public class TestSomethingWithMyRunner { 

    private ClassToTest fixture;  

    @Before 
    public void setup() {     
     fixture = new ClassToTest();  
    } 

    @Test 
    public void create() {    
     System.out.println(SomeStaticClass.variable); // prints null 
     assertNotNull(SomeStaticClass.variable); // fails 
    } 
} 

덮어 쓰기 실행 방법도 작동하지 않습니다.

@Override 
public void run(RunNotifier notifier) { 
    SomeStaticClass.variable = mock(Variable.class) 
    super.run(notifier); 
} 

테스트가 처리되기 전에 정적 공개 필드를 설정하려면 어디에서 연결해야합니까?

답변

1

나는 절대 그렇게하지 않을 것입니다.

매우 엄격한 입력란과 테스트 코드 사이의 결합이 매우 빡빡합니다 (). 그리고 더 나쁜,이 "관계"는 매우 숨겨져있을 것입니다.

내 제안 : Runner의 하위 클래스에 물건을 넣는 대신이 설정이 필요한 테스트 케이스에서 호출 할 수있는 도우미 메서드를 만듭니다.

테스트를 보는 다른 사람들이 너무 쉽게 당신이 자신의 러너를 사용하고 있다는 것을 간과 할 수 있으므로 (커버 아래에) 그러한 정적 설정을 수행하지 마십시오. 이러한 것들은 명시 적이어야합니다. 단위 테스트는 각 테스트 케이스로 들어가는 모든 "준비"를 쉽게 이해할 수 있도록 작성되어야합니다. 고객 러너를 사용하는 것은 그것의 "반대"를 달성하고 있습니다!

이외에도 : 왜 PowerMock을 처음 사용합니까? Mockito 또는 EasyMock이 여기에서 할 것입니다.