Ответ 1
Восстановите свои тестовые классы.
- Если вы не хотите использовать тесты из базового класса, не расширяйте его
- Если вам нужны другие функции из базового класса, разделите этот класс на два - тесты и другие функции
Скажем, у меня есть тестовый класс под названием testFixtureA
с несколькими методами testA
, testB
, testC
и т.д., каждый с аннотацией @Test
.
Теперь скажем, что подкласс testFixtureA
в класс называется testFixtureAB
, и я ничего не перезаписываю. testFixtureAB
пуст, как сейчас.
Когда я запускаю тесты из testFixtureAB
, методы testA
, testB
и testC
выполняются тестовым runner, потому что тестовый бегун не различает тестовые методы от класса и базового класса.
Как заставить тестового бегуна исключить тесты из базового класса?
Восстановите свои тестовые классы.
и я ничего не перезаписываю. testFixtureAB пуст, как сейчас
Вот ваш ответ. Если вы не хотите запускать testB из основного класса, переопределите его:
public class testFixtureAB extends testFixtureA {
@Override
public void testB() {}
}
игнорирование всего базового класса:
@Ignore
class BaseClass {
// ...
}
Довольно легко реализовать несколько классов:
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);
}
}
В последнем JUnit вы можете использовать аннотацию @Rule в подклассе для проверки имени теста и перехвата тестового прогона для динамического игнорирования теста. Но я бы предположил, что идея @Bozho лучше - тот факт, что вам нужно это сделать, указывает на большую проблему, которая, вероятно, показывает наследование, не является правильным решением здесь.
Я знаю, это не ответ...
Рассмотрим причину, по которой вы расширяете конкретные классы тестов. Таким образом вы дублируете методы тестирования.
Если вы делитесь кодом между тестами, подумайте о том, чтобы написать базовые тестовые классы с помощью методов настройки помощника и приспособления или тестовый класс-помощник.
Если для запуска тестов попробуйте организовать тесты с наборами и категории.
Что делать, если вы хотите выполнить один и тот же тест для разных конфигураций одного и того же набора тестов?
Например, скажем, у вас есть класс A с методами test1, test2 и test3, которые попадают во встроенную базу данных, тогда вы хотите создать отдельные "setUp" и "tearDown" для каждого встроенного поставщика (H2, HyperSQL и т.д.), но запускаете те же тесты для каждого из них.
Я хотел бы расширить класс, содержащий эти методы тестирования, и настроить его в подклассе. Моя проблема заключается в том, что суперкласс НЕ ДОЛЖЕН считаться подходящим для тестирующего участника. Проблема возникает, когда тестовый бегун выполняет суперклассу и учитывая, что не найден соответствующий метод настройки и разрыва, он разбивается: (
В базовом тестовом классе методы @Test:
assumeTrue(getClass().equals(BaseClassTest.class));
Он будет игнорировать те, которые содержатся в тестах подкласса, но не полностью их исключают.
Если по какой-либо причине вам нужны два класса JUnit для одной и той же функциональности, лучший подход для меня:
TestFixture
только с константами и TestFixture
службами.TestFixtureA
и TestFixtureB
Таким образом, у вас не будет ни дублированного кода, ни двойных прогонов.