Исключить индивидуальный тест из метода "до" в 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 аннотации.