Как связать точку данных с теорией?



@DataPoints public static final Integer[] input1={1,2};
@Theory
@Test
public void test1(int input1){

}

@DataPoints public static final Integer[] input2={3,4};
@Theory
@Test
public void test2(int input2 ){

}


Я хочу, чтобы test1 выполнялся с набором данных input1 - {1,2} , а test2 - с input2 - {3,4}. Но в настоящее время каждый тест выполняется с обоими наборами данных {1,2,3,4}. Как привязать определенные точки @ DataPoints к определенным точкам @ Theorys

547   4  

4 ответов:

Точки данных применяются к классу. Если у вас есть метод @Theory, который принимает int, и у вас есть точка данных, которая является массивом int, то он будет вызван с помощью int.

@RunWith(Theories.class)
public class TheoryTest {
    @DataPoint public static int input1 = 45;
    @DataPoint public static int input2 = 46;
    @DataPoints public static String[] inputs = new String[] { "foobar", "barbar" };

    @Theory public void testString1(String input) {
        System.out.println("testString1 input=" + input);
    }

    @Theory public void testString2(String input) {
        System.out.println("testString2 input=" + input);
    }

    @Theory public void test1(int input) {
        System.out.println("test1 input=" + input);
    }

    @Theory public void test2(int input) {
        System.out.println("test2 input=" + input);
    }
}

Это вызывает test1 с 45 & 46, и test2 с 45 & 46. Он вызывает testString1 с "foobar" и "barbar" и testString2 с "foobar"и " barbar".

Если вы действительно хотите использовать разные наборы данных для разных теорий, вы можете обернуть данные в частный класс:

@RunWith(Theories.class)
public class TheoryTest {
    public static class I1 { int i; public I1(int i) { this.i = i;} }
    public static class I2 { int i; public I2(int i) { this.i = i;} }

    @DataPoint public static I1 input1 = new I1(45);
    @DataPoint public static I2 input2 = new I2(46);

    @Theory
    public void test1(I1 input) {
        System.out.println("test1 input=" + input.i);
    }

    @Theory
    public void test2(I2 input) {
        System.out.println("test2 input=" + input.i);
    }
}

Это вызывает тест1 с 45 и тест2 с 46. Это работает, но, на мой взгляд, это затеняет код, и может быть лучшим решением просто разделить тестовый класс на два класса.

С JUnit 4.12 (не уверен, когда он был введен) можно назвать точки данных и назначить их параметрам (я узнал это из http://farenda.com/junit/junit-theories-with-datapoints/):

@RunWith(Theories.class)
public class TheoriesAndDataPointsTest {
    @DataPoints("a values")
    public static int[] aValues() {
        return new int[]{1, 2};
    }

    @DataPoints("b values")
    public static int[] bValues() {
        return new int[]{3, 4};
    }

    @Theory
    public void theoryForA(@FromDataPoints("a values") int a) {
        System.out.printf("TheoryForA called with a = %d\n", a);
    }

    @Theory
    public void theoryForB(@FromDataPoints("b values") int a) {
        System.out.printf("TheoryForB called with b = %d\n", a);
    }
}

Вывод:

TheoryForA called with a = 1
TheoryForA called with a = 2
TheoryForB called with b = 3
TheoryForB called with b = 4

Некоторые из ссылок, которые я видел, говорят об использовании тестов для конкретных значений и теорий для проверки поведения. Например, если у вас есть класс, который имеет методы для добавления и вычитания из атрибута, тест проверит правильность результата (например, 1+3 возвращает 4), тогда как теория может проверить, что для значений точек данных (x1, y1), (x2, y2), x+y-y всегда равно x, x-y+y всегда равно x, x*y/y всегда равно x и т. д. Таким образом, результаты теорий не связаны как плотно с данными. С помощью теорий вы также можете отфильтровать такие случаи, как y = = 0; они не считаются неудачей. Итог: вы можете использовать и то, и другое. Хорошая статья-это: http://web.archive.org/web/20110608210825/http://shareandenjoy.saff.net/tdd-specifications.pdf

В отношении ответа Габора Липтака, именованные точки данных могут быть определены как статические поля (Ссылка), которые дают нам более краткий код:

@RunWith(Theories.class)
public class TheoriesAndDataPointsTest {
    @DataPoints("a values")
    public static int[] aValues = {1, 2};

    @DataPoints("b values")
    public static int[] bValues = {3, 4};

    @Theory
    public void theoryForA(@FromDataPoints("a values") int a) {
        System.out.printf("TheoryForA called with a = %d\n", a);
    }

    @Theory
    public void theoryForB(@FromDataPoints("b values") int a) {
        System.out.printf("TheoryForB called with b = %d\n", a);
    }
}

Comments

    Ничего не найдено.