У меня есть следующая теория для проверки. В коде я хочу, чтобы переменная a была четной, а переменная b — нечетной
@RunWith(Theories.class)
public class TestJunit{
// add the error
@DataPoints
public static Integer[] integersOdd() {
return new Integer[]{1, 3, 5};
}
@DataPoints
public static Integer[] integersEven() {
return new Integer[]{2, 4, 6};
}
@Theory
public void testAdd(Integer a , Integer b) {
...
}
}
На данный момент я использую acceptTrue и функцию проверки, например:
public boolean validateInput(Integer a, Integer b){
Set<Integer> even = new HashSet<Integer>(Arrays.asList(integersEven()));
Set<Integer> odd = new HashSet<Integer>(Arrays.asList(integersOdd()));
return (even.contains(a) && odd.contains(b));
}
Модифицированная теория:
@Theory
public void testAdd(Integer a , Integer b) {
Assume.assumeTrue(validateInput(a,b));
System.out.println("a="+a+", b="+b);
assertTrue(a+b>-1);
// add any test
}
Это очень грязный способ, так как Java выберет все комбинации и отбросит входные данные в assumeTrue. Что, если у меня есть 10 теорий с 10 точками данных? Java попробует 100 комбинаций, а я хотел только 10!
Есть ли аккуратный способ сделать это? Может быть какая-то аннотация, чтобы указать JUnit выбирать значения для переменных, из которых DataPoint?
Редактировать. Еще один способ, который я обнаружил, — использовать генераторы тестов. Я использую JUnit-QuickCheck [Читать здесь] для генерации случайных данных в соответствии с диапазоном, требуемым мои переменные. Затем я инкапсулирую их в класс и передаю этот объект в свою теорию для проверки.