При запуске следующего MWE тест testDataPointsMethodFailsForPrimitives
выходит из строя с помощью AssertionError: Never found parameters that satisfied method assumptions. Violated assumptions: []
AssertionError: Never found parameters that satisfied method assumptions. Violated assumptions: []
но отлично передаются при раскомментировании точек данных, созданных как статические члены тестового класса. testDataPointsMethodWorksForObjects
, с другой стороны, работает только денди, как есть.
Почему точки данных, которые являются примитивами, не распознаются JUnit при создании через метод, а точки данных, которые являются объектами?
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
@RunWith(Theories.class)
public class MWE {
// @DataPoints
// public static int[] primitiveArray = new int[] {1, 2, 3, 4, 5, 6};
@DataPoints
public static int[] primitiveMethod() {
return new int[] {1, 2, 3, 4, 5, 6};
}
@DataPoints
public static Integer[] objectMethod() {
return new Integer[] {1, 2, 3, 4, 5, 6};
}
@Theory
public void testDataPointsMethodFailsForPrimitives(int primitive) {
}
@Theory
public void testDataPointsMethodWorksForObjects(Integer primitive) {
}
}
Похоже, это исправлено в 4.12 бета-версиях JUnit. Вот описание проблемы и ее разрешение: https://github.com/junit-team/junit/issues/637
Да, проблема вызвана ошибкой в junit-4.11. Это особенно проблематично, если вы используете Intellij, поскольку он поставляется по умолчанию с junit-4.11.
Вот как я его исправил:
После этого вы можете использовать @DataPoints
с примитивным типом данных, например:
@DataPoints
public static int[] primitiveMethod() {
System.out.println("creating data points ...");
return new int[] {1, 2, 3, 4, 5, 6};
}
@Theory
public void testDataPointsMethodFailsForPrimitives(int primitive) {
}