Как связать точку данных с теорией?
@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
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