Попробовал повозиться с аннотациями (сделать аналог Parameterized), но довольно быстро понял, что так просто это не получится.
Как вариант можно использовать вариант, предложенный dzhariy, но немножко причесать его. Вот какой вариант видится мне:
1) реализовать свой класс-наследник от TestCase, в нем определить список параметров и переопределить метод runBare(), который завернуть в цикл по параметрам, для доступа к текущему значению параметра использовать протектед переменную.
2) классы тестов наследовать от нашего TestCase, при необходимости переопределить метод для формирования списка параметров
Минусы:
1) цикл по параметрам выполняется до первой ошибки, т.е. если при каком-то значении параметра возникнет ошибка, то последующие итерации выполнены не будут (можно решить подавлением ошибок и репортингом статусов итераций тестов в переопределенном runBare())
2) JUnit-плагин не отображает разбивки по итерациям (как это делает JUnit4 при использовании Parameterized)
Плюсы:
1) остаются все преимущества JUnit
2) минимум изменения в тестах (изменить класс родителя, переопределить метод data() при необходимости)
Делал аналогично использованию Parameterized в JUnit4, но понятно, что можно хранить в качестве текущего значения не массов объектов, а конкретный класс. Подозреваю, что описанные выше проблемы тоже можно решить, но нужно ковыряться с используемыми классами-раннерами.
{syntaxhighlighter brush: java;fontsize: 100; first-line: 1; }public class MyTestCase extends TestCase {
protected Collection<Object[]> parameters = data();
protected Object[] parameter;
protected int iteration;
@Override
public void runBare() throws Throwable {
iteration = -1;
for (Object[] param : parameters) {
this.parameter = param;
iteration++;
super.runBare();
}
}
protected Collection<Object[]> data() {
Collection<Object[]> data = new ArrayList<Object[]>();
data.add(new Object[]{null});
return data;
}
}{/syntaxhighlighter}
Пример теста с иллюстрацией:
{syntaxhighlighter brush: java;fontsize: 100; first-line: 1; }public class MyTest extends MyTestCase {
public void setUp() {
System.err.println(“setUp”);
}
public void tearDown() {
System.err.println(“tearDown”);
}
public void testTrue() {
getInfoAboutCurrentIteration();
Assert.assertTrue(true);
}
public void testTrue2() {
getInfoAboutCurrentIteration();
Assert.assertTrue(false);
}
private void getInfoAboutCurrentIteration() {
String parameterDescription = “(length: " + parameter.length + “)”;
for (Object obj : parameter) {
parameterDescription = parameterDescription + obj.toString();
}
System.err.println(String.format(” - - - Iteration: %s, parameter: %s", iteration, parameterDescription));
}
@Override
protected Collection<Object[]> data() {
Collection<Object[]> data = new ArrayList<Object[]>();
data.add(new Object[]{1});
data.add(new Object[]{2});
data.add(new Object[]{3});
return data;
}
}
{/syntaxhighlighter}