2017-01-27 5 views
0

Мне нужно PowerMockRunner для нескольких моих тестов, и я использую стороннюю библиотеку, которая использует статические общедоступные поля, которые могут быть не пустыми.расширить PowerMockRunner и установить публичные статические поля

Это работает:

@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 
    } 
} 

Так что я решил, что я хочу поставить SomeStaticClass.variable = mock(Variable.class); часть в собственном PowerMockRunner, как это:

public class MyRunner extends PowerMockRunner { 
    public MyRunner(Class<?> klass) throws Exception { 
     super(klass); 
     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 сделали бы здесь.

Смежные вопросы