@параметры в Junit 4
-
05-07-2019 - |
Вопрос
Могу ли я иметь более одного метода с @Parameters в классе тестирования junit, который работает с классом Parameterized?
@RunWith(value = Parameterized.class)
public class JunitTest6 {
private String str;
public JunitTest6(String region, String coverageKind,
String majorClass, Integer vehicleAge, BigDecimal factor) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data1() {
Object[][] data = {{some data}}
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized str is : " + str);
str = null;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some other data}}
return Arrays.asList(data);
}
@Test
public void pullTest() {
System.out.println("Parameterized new str is : " + str);
str = null;
}
}
Решение
Вы можете использовать Теории (поиск по теориям слов на эта ссылка) для передачи различных параметров в разные методы.
Другие советы
Вероятно, метод data1
, но нет никакой гарантии, что он будет использовать тот, который JVM сначала предоставит junit4.
Вот соответствующий код из junit:
private FrameworkMethod getParametersMethod(TestClass testClass) throws Exception {
List<FrameworkMethod> methods= testClass.getAnnotatedMethods(Parameters.class);
for (FrameworkMethod each : methods) {
int modifiers= each.getMethod().getModifiers();
if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))
return each;
}
throw new Exception("No public static parameters method on class " + testClass.getName());
}
Таким образом, будет использоваться первый открытый статический аннотированный метод, который он найдет, но он может найти их в любом порядке.
Почему у вас тест написан таким образом? У вас должен быть только один @Parameters
-аннотированный метод.
Он не предназначен для использования более одного метода данных. Вы можете увидеть это в ответе Скаффмана .
Почему не предусмотрено реализовать два метода данных?
Ответ может быть следующим: муфта.
Слишком сложно разделить этот тест на два тестовых случая? Вы сможете ввести небольшое наследование и поделиться общими методами. С двумя тестовыми сценариями вы можете предоставить два отдельных метода данных и очень хорошо протестировать свои вещи.
Надеюсь, это поможет.
Вы можете создавать внутренние классы для каждого набора методов, которые работают с одинаковыми параметрами. Например:
public class JunitTest6 {
@RunWith(value = Parameterized.class)
public static class PushTest{
private String str;
public PushTest(String region) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some data}}
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized str is : " + str);
str = null;
}
}
@RunWith(value = Parameterized.class)
public static class PullTest{
private String str;
public PullTest(String region) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some other data}}
return Arrays.asList(data);
}
@Test
public void pullTest() {
System.out.println("Parameterized new str is : " + str);
str = null;
}
}
}