Похоже, что TestNG не страдает от этой проблемы .
Я не настолько отчаялся, поэтому я изменил встроенный класс Parameterized для поддержки этой функции. Просто аннотируйте применимые тесты как @NonParameterized.
Обратите внимание, что этот класс работает только со своими аннотациями, т.е. проверяет ваш импорт.
<code>import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.junit.Test;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.Suite;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.junit.runners.model.TestClass;
/**
* <p>
* The custom runner <code>Parameterized</code> implements parameterized tests.
* When running a parameterized test class, instances are created for the
* cross-product of the test methods and the test data elements.
* </p>
* For example, to test a Fibonacci function, write:
*
* <pre>
* @RunWith(Parameterized.class)
* public class FibonacciTest {
* @Parameters
* public static List<Object[]> data() {
* return Arrays.asList(new Object[][] {
* Fibonacci,
* { {0, 0}, {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5},
* {6, 8}}});
* }
*
* private int fInput;
*
* private int fExpected;
*
* public FibonacciTest(int input, int expected) {
* fInput = input;
* fExpected = expected;
* }
*
* @Test
* public void test() {
* assertEquals(fExpected, Fibonacci.compute(fInput));
* }
* }
*
*
* Каждый экземпляр FibonacciTest
будет построен с использованием
* конструктор с двумя аргументами и значения данных в
* @Parameters
метод.
*
* /
открытый класс Parameterized extends Suite {
/ **
* Аннотация для метода, который предоставляет параметры для ввода в
* конструктор тестового класса
Parameterized
* /
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.METHOD)
public static @interface Parameters {
}
/ **
* Аннотация для методов, которые не должны быть параметризованы
* /
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.METHOD)
public static @interface NonParameterized {
}
закрытый класс TestClassRunnerForParameters extends
BlockJUnit4ClassRunner {
private final int fParameterSetNumber;
приватный финал List fParameterList;
TestClassRunnerForParameters (Class <?> Type,
List parameterList, int i) throws InitializationError {
супер (типа);
fParameterList = parameterList;
fParameterSetNumber = i;
}
@Override
public Object createTest () выдает Exception {
return getTestClass (). getOnlyConstructor (). newInstance (
computeParams ());
}
закрытый объект [] computeParams () создает исключение {
пытаться {
return fParameterList.get (fParameterSetNumber);
} catch (ClassCastException e) {
бросить новое исключение (String.format (
"% s.% s () должен вернуть коллекцию массивов.",
getTestClass (). getName (), getParametersMethod (
. GetTestClass ()) GetName ()));
}
}
@Override
protected String getName () {
return String.format ("[% s]", fParameterSetNumber);
}
@Override
Защищенное String testName (окончательный метод FrameworkMethod) {
return String.format ("% s [% s]", method.getName (),
fParameterSetNumber);
}
@Override
protected void validateConstructor (Список ошибок) {
validateOnlyOneConstructor (ошибки);
}
@Override
Защищенный оператор classBlock (уведомитель RunNotifier) {
вернуть childrenInvoker (уведомитель);
}
@Override
Защищенный список computeTestMethods () {
List ret = super.computeTestMethods ();
for (Iterator i = ret.iterator (); i.hasNext ();) {
FrameworkMethod frameworkMethod =
(FrameworkMethod) i.next ();
if (isParameterized () ^
! FrameworkMethod.getMethod (). IsAnnotationPresent (
NonParameterized.class)) {
i.remove ();
}
}
возвратный ответ;
}
защищенный логический isParameterized () {
вернуть истину;
}
}
закрытый класс TestClassRunnerForNonParameterized extends
TestClassRunnerForParameters {
TestClassRunnerForNonParameterized (тип Class <?>,
List parameterList, int i)
throws InitializationError {
супер (тип, parameterList, i);
}
защищенный логический isParameterized () {
вернуть ложь;
}
}
закрытый финал ArrayList runners = new ArrayList ();
/ **
* Только называется рефлексивно. Не используйте программно.
* /
public Parameterized (Class <?> klass) throws Throwable {
супер (класс, Коллекции. emptyList ());СписокparametersList = getParametersList (getTestClass ());if (parametersList.size ()> 0) {try {runners.add (new TestClassRunnerForNonParameterized (getTestClass () .getJavaClass (), parametersList, 0));} catch (Exception e) {System.out.println («Нет непараметрических тестов.»);}} try {for (int i = 0; i getChildren () {возврат бегунов;} @SuppressWarnings ("unchecked") личный списокgetParametersList (TestClass klass) throws Throwable {return (Список)) getParametersMethod (klass) .invokeExplosively (null);} private FrameworkMethod getParametersMethod (TestClass testClass) генерирует исключение {List method = testClass .getAnnotatedMethods (Parameters.class);for (FrameworkMethod each: method) {int modifiers = each.getMethod (). getModifiers ();if (Modifier.isStatic (modifiers) && Modifier.isPublic (modifiers)) возвращает каждый;} генерировать новое исключение («Метод открытых статических параметров в классе» + testClass.getName ());}}
Обновление: Я пытаюсь добавить подобные вещи в junit.