Исключить отдельный тест из метода "до" в JUnit
Все тесты в моем тестовом классе выполняют метод before (аннотированный с помощью JUnit's @Before
) перед выполнением каждого теста.
Мне нужен конкретный тест, чтобы не выполнять это перед методом.
Есть ли способ сделать это?
8 ответов
К сожалению, вы должны закодировать эту логику. У JUnit такой функции нет. Обычно у вас есть 2 решения:
- Просто разделите тестовый набор на 2 тестовых случая: один содержит тесты, которые требуют запуска "до", а второй содержит тесты, которые этого не требуют.
- Реализуйте свой собственный тест и запишите свой тест, чтобы использовать его. Создайте свою собственную аннотацию
@RequiresBefore
и отметьте тесты, которые нуждаются в этом, с помощью этой аннотации. Организатор теста проанализирует аннотацию и решит, следует ли запускать метод "до" или нет.
Второе решение более понятно. Первый проще. Это зависит от вас, чтобы выбрать один из них.
Вы можете сделать это с помощью 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();
}
};
}
Рассмотрите возможность использования @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(){}
}
}
Этот вопрос был задан некоторое время назад, тем не менее, я хотел бы поделиться своим решением:
Добавьте аннотацию к желаемому методу с помощью
@Tag("skipBeforeEach")
В вашем методе setup ():
@BeforeEach void setup(final TestInfo info) { final Set<String> testTags = info.getTags(); if(testTags.stream() .filter(tag->tag.equals("skipBeforeEach")) .findFirst() .isPresent()){ return; } // do your stuff }```
Если вы используете Mockito, особенно Mockito 3.0, все заглушки будут "строгими" и проверяться по умолчанию.
Вы можете использовать метод Mockito lenient().
Подробнее здесь: https://www.baeldung.com/mockito-unnecessary-stubbing-exception#lenient-stubbing
Я искал решение этой проблемы и наткнулся на этот вопрос. В качестве обновления в JUnit 5 теперь это можно легко сделать с помощью аннотации @Nested.
Можно также решить эту проблему, отменив то, что было сделано в @Before
настройка внутри тестового случая. Вот как это может выглядеть,
@Before
public void setup() {
TestDataSetupClass.setupTestData();
}
@Test
public void testServiceWithIgnoreCommonSetup() {
TestDataSetupClass.unSet();
//Perform Test
}
Здесь будут плюсы и минусы для решений. Незначительным минусом для этого является ненужный цикл установки и отмены шага. Но все идет хорошо, если нужно сделать это только для сотен тестовых примеров и избежать накладных расходов при написании собственной AOP или поддержки нескольких внутренних классов тестирования.
Если у вас есть метод @After, который может очистить работу, выполненную в @Before, вы можете вручную вызвать метод @After в начале вашего метода @Test.