6

我可以在使用 Parameterized 类运行的 junit 测试类中使用多个 @Parameters 方法吗?

@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

4 回答 4

3

您可以使用Theories运行器(在该链接上搜索单词 theories)将不同的参数传递给不同的方法。

于 2009-09-30T03:34:51.570 回答
2

可能是该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-annotated 方法。

于 2009-07-30T12:24:05.380 回答
2

它没有指定具有一种以上的数据方法。您可以在skaffman 的回答中看到它。

为什么不提供实现两种数据方法?
答案可能是:耦合。

将此测试分成两个测试用例是否太复杂?您将能够引入一个小的继承并共享通用方法。使用两个测试用例,您可以提供两种分离的数据方法并很好地测试您的东西。

我希望它有所帮助。

于 2009-09-30T06:25:50.033 回答
1

您可以为操作相同参数的每组方法创建内部类。例如:

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;
  }
 }
}
于 2010-07-08T22:02:53.283 回答