Исключить индивидуальный тест из метода "до" в JUnit
Все тесты в моем тестовом классе выполняют метод 'before' (аннотированный с JUnit @Before
) перед выполнением каждого теста.
Мне нужен конкретный тест, чтобы не выполнять это перед методом.
Есть ли способ сделать это?
Ответы
Ответ 1
К сожалению, вам нужно закодировать эту логику. У JUnit нет такой функции.
Как правило, у вас есть 2 решения:
- Просто отдельный тестовый пример для двух тестовых примеров: один, который содержит тесты, которые требуют "до", и второй, который содержит тесты, которые этого не требуют.
- Внедрите свой собственный тестовый запуск и добавьте комментарий к нему, чтобы использовать его. Создайте свою собственную аннотацию
@RequiresBefore
и отметьте те тесты, которые нуждаются в этом, с этой аннотацией. Тест-лингер проанализирует аннотацию и решит, следует ли запускать метод "раньше" или нет.
Второе решение более ясное. Первое проще. Это зависит от вас, чтобы выбрать один из них.
Ответ 2
Вы можете сделать это с помощью TestRule. Вы отмечаете тест, который вы хотите пропустить ранее, с аннотацией какого-либо описания, а затем в методе apply в TestRule вы можете проверить эту аннотацию и сделать то, что хотите, что-то вроде:
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
if (description.getAnnotation(DontRunBefore.class) == null) {
// run the before method here
}
base.evaluate();
}
};
}
Ответ 3
Рассмотрите возможность использования бегуна @Enclosed
, чтобы иметь два внутренних класса тестирования. Один с необходимым методом @Before
, другой без.
закрываемый
@RunWith(Enclosed.class)
public class Outer{
public static class Inner1{
@Before public void setup(){}
@Test public void test1(){}
}
public static class Inner2{
// include or not the setup
@Before public void setup2(){}
@Test public void test2(){}
}
}
Ответ 4
Можно также решить эту проблему, отменив настройку @Before
внутри тестового примера.
Вот как это может выглядеть,
@Before
public void setup() {
TestDataSetupClass.setupTestData();
}
@Test
public void testServiceWithIgnoreCommonSetup() {
TestDataSetupClass.unSet();
//Perform Test
}
Там будут преимущества и недостатки решений. Незначительный переход для этого - ненужный цикл установки и отмены настройки. Но все идет хорошо, если нужно сделать это только для теста из сотен и избежать накладных расходов на самообслуживание AOP или поддержание нескольких внутренних тестовых классов.
Ответ 5
Я искал решение этой проблемы и столкнулся с этим вопросом. В качестве обновления, в JUnit 5 это теперь легко сделать с помощью @Nested аннотации.