@параметры в Junit 4 - PullRequest
       31

@параметры в Junit 4

6 голосов
/ 30 июля 2009

Могу ли я иметь более одного метода с @Parameters в тестовом классе junit, который работает с параметризованным классом?

@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;
 }
}

Ответы [ 4 ]

3 голосов
/ 30 сентября 2009

Вы можете использовать бегунок Theories (поиск теорий слов по этой ссылке) для передачи различных параметров различным методам.

2 голосов
/ 30 сентября 2009

Он не предназначен для использования более одного метода данных. Вы можете увидеть это в ответе Скаффмана .

Почему не предусмотрено реализовать два метода данных?
Ответ может быть: Сцепление.

Не слишком ли сложно разделить этот тест на два тестовых случая? Вы сможете ввести небольшое наследование и поделиться общими методами. С двумя тестовыми сценариями вы могли бы предоставить два отдельных метода данных и очень хорошо протестировать ваши вещи.

Надеюсь, это поможет.

2 голосов
/ 30 июля 2009

Вероятно, метод 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 -аннотированный метод.

1 голос
/ 09 июля 2010

Вы можете создавать внутренние классы для каждого набора методов, которые работают с одинаковыми параметрами. Например:

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;
  }
 }
}
...