Подтвердить что ты не робот

JUnit игнорировать методы @Test из базового класса

Скажем, у меня есть тестовый класс под названием testFixtureA с несколькими методами testA, testB, testC и т.д., каждый с аннотацией @Test.

Теперь скажем, что подкласс testFixtureA в класс называется testFixtureAB, и я ничего не перезаписываю. testFixtureAB пуст, как сейчас.

Когда я запускаю тесты из testFixtureAB, методы testA, testB и testC выполняются тестовым runner, потому что тестовый бегун не различает тестовые методы от класса и базового класса.

Как заставить тестового бегуна исключить тесты из базового класса?

4b9b3361

Ответ 1

Восстановите свои тестовые классы.

  • Если вы не хотите использовать тесты из базового класса, не расширяйте его
  • Если вам нужны другие функции из базового класса, разделите этот класс на два - тесты и другие функции

Ответ 2

и я ничего не перезаписываю. testFixtureAB пуст, как сейчас

Вот ваш ответ. Если вы не хотите запускать testB из основного класса, переопределите его:

public class testFixtureAB extends testFixtureA {
   @Override
   public void testB() {}
}

Ответ 4

Довольно легко реализовать несколько классов:

  • Создайте свой собственный TestRunner
  • Создайте аннотацию, например @IgnoreInheritedTests
  • Создайте класс, который расширяет org.junit.runner.manipulation.Filter

В классе фильтра:

public class InheritedTestsFilter extends Filter {

    @Override
    public boolean shouldRun(Description description) {
        Class<?> clazz = description.getTestClass();
        String methodName = description.getMethodName();
        if (clazz.isAnnotationPresent(IgnoreInheritedTests.class)) {
            try {
                return clazz.getDeclaredMethod(methodName) != null;
            } catch (Exception e) {
                return false;
            }
        }
        return true;
    }

    @Override
    public String describe() {
        // TODO Auto-generated method stub
        return null;
    }

}

на вашем пользовательском бегуне:

 /**
 * @param klass
 * @throws InitializationError
 * @since
 */
public CustomBaseRunner(Class<?> klass) throws InitializationError {
    super(klass);
    try {
        this.filter(new InheritedTestsFilter());
    } catch (NoTestsRemainException e) {
        throw new IllegalStateException("class should contain at least one runnable test", e);
    }
}

Ответ 5

В последнем JUnit вы можете использовать аннотацию @Rule в подклассе для проверки имени теста и перехвата тестового прогона для динамического игнорирования теста. Но я бы предположил, что идея @Bozho лучше - тот факт, что вам нужно это сделать, указывает на большую проблему, которая, вероятно, показывает наследование, не является правильным решением здесь.

Ответ 6

Я знаю, это не ответ...

Рассмотрим причину, по которой вы расширяете конкретные классы тестов. Таким образом вы дублируете методы тестирования.

Если вы делитесь кодом между тестами, подумайте о том, чтобы написать базовые тестовые классы с помощью методов настройки помощника и приспособления или тестовый класс-помощник.

Если для запуска тестов попробуйте организовать тесты с наборами и категории.

Ответ 7

Что делать, если вы хотите выполнить один и тот же тест для разных конфигураций одного и того же набора тестов?

Например, скажем, у вас есть класс A с методами test1, test2 и test3, которые попадают во встроенную базу данных, тогда вы хотите создать отдельные "setUp" и "tearDown" для каждого встроенного поставщика (H2, HyperSQL и т.д.), но запускаете те же тесты для каждого из них.

Я хотел бы расширить класс, содержащий эти методы тестирования, и настроить его в подклассе. Моя проблема заключается в том, что суперкласс НЕ ДОЛЖЕН считаться подходящим для тестирующего участника. Проблема возникает, когда тестовый бегун выполняет суперклассу и учитывая, что не найден соответствующий метод настройки и разрыва, он разбивается: (

Ответ 8

В базовом тестовом классе методы @Test:

assumeTrue(getClass().equals(BaseClassTest.class));

Он будет игнорировать те, которые содержатся в тестах подкласса, но не полностью их исключают.

Ответ 9

Если по какой-либо причине вам нужны два класса JUnit для одной и той же функциональности, лучший подход для меня:

  • поместите общий код в родительский класс TestFixture только с константами и TestFixture службами.
  • создать два подкласса: TestFixtureA и TestFixtureB

Таким образом, у вас не будет ни дублированного кода, ни двойных прогонов.