Исключить отдельный тест из метода "до" в JUnit

Все тесты в моем тестовом классе выполняют метод before (аннотированный с помощью JUnit's @Before) перед выполнением каждого теста.

Мне нужен конкретный тест, чтобы не выполнять это перед методом.

Есть ли способ сделать это?

8 ответов

Решение

К сожалению, вы должны закодировать эту логику. У JUnit такой функции нет. Обычно у вас есть 2 решения:

  1. Просто разделите тестовый набор на 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(){}
  }

}

Этот вопрос был задан некоторое время назад, тем не менее, я хотел бы поделиться своим решением:

  1. Добавьте аннотацию к желаемому методу с помощью @Tag("skipBeforeEach")

  2. В вашем методе 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.

Другие вопросы по тегам