2015-04-09 2 views
2

Высокий уровень, у меня есть класс тестирования JUnit, который довольно прост. У меня есть несколько @Tests и один @Before, который делает некоторые настройки. Для одного тестового примера настройка меняется (я не хочу, чтобы она запускалась).Пропустить @Before для теста || Есть ли способ выполнить методы @Before в TestRule?

Из поиска найдено https://stackoverflow.com/a/13017452/413254. Это предполагает создание @Rule, который проверяет конкретную аннотацию и выполняет оператор @Before.

Мое замешательство заключается в том, как выполнить метод @Before в правиле. Есть ли способ сделать это? Или мне нужно пройти в самом тестовом классе и выполнить метод @before (setup() в примере ниже)?

public class NoBeforeRule implements TestRule { 

    @Override 
    public Statement apply(final Statement base, final Description description) { 
     return new Statement() { 
      @Override 
      public void evaluate() throws Throwable { 
       if (description.getAnnotation(NoBefore.class) == null) { 
        // Is there something like `base.executeAllTheBefores()' 
       } 

       base.evaluate(); 
      } 
     }; 
    } 
} 

Соответствующий код теста:

@Rule public NoBeforeRule mNoBeforeRule = new NoBeforeRule(this); 

@Before 
@Override 
public void setup() { 
} 

@Test 
public void testNeedSetup() { 
    // this should run setup() 
} 

@NoBefore 
@Test 
public void testNoSetup() { 
    // this should NOT run setup() 
} 

ответ

1

Может играть с правилом АСМАП

@Rule public TestName name = new TestName(); 

@Before 
public void setup() { 
    if(listOfTestNeedSetup.contains(name.getMethodName()) { 
     // need setup 
    } 
} 
2

Почему вы не просто разделить тесты в 2 отдельных тестовых классов? Те, которые нуждаются в настройке, входят в один класс и один (и), которые не входят в другой.

Существует не правило (или даже руководство), в котором говорится, что все тесты для класса должны проходить в один тестовый класс, и это на самом деле то, что я делаю очень часто.

Тот факт, что у вас есть один или несколько тестов, которые не нуждаются в общей установке, вероятно, свидетельствует о том, что сами тесты не являются сплоченными и проверяют различные варианты тестируемого вами класса. Например, у меня может быть множество методов, которые имеют макетную настройку определенным образом для положительных тестов, но затем другие тесты, которые в ней нуждаются, настроены по-разному для сценариев сбоев. Я перенесу эти тесты на 2 класса - в частности, для положительных сценариев и для сценариев сбоев.

Игра вокруг с правилами и такими, как явно избежать работает стандартный @Before метод будет просто сделать вещи более сложными и иметь ваше будущее самостоятельно или коллеги ломают голову, почему метод установки не бежится