JUnit具有不同输入的相同测试用例

时间:2013-12-05 00:36:00

标签: java unit-testing junit

我需要测试一种方法,例如:

public ObjRet foo(string input)
{
...
return objRet;
}

对于上面的方法,一个测试用例涉及input = {null,“”,“”等,这将返回相同的默认对象,还有其他测试用例

我是否需要为每个输入分别设置测试用例(即使我需要验证相同的默认对象)

或者我可以做这样的事情,

@Test
void testing()
{
  String[] inputs = {null, "", " "};
  List<ObjRet> received = new List<ObjRet>();
  for(string input : inputs)
     received.add(foo(input));

  for(ObjRet obj : received)
      Assert.assertEquals(obj, default);
}

我只是想确保它是一个很好的做法,可以使用for循环进行断言

1 个答案:

答案 0 :(得分:2)

JUnitParams库是创建您所描述的参数化测试类型的完美方式。我默认将它包含在每个项目中,因为这种模式很常见。有关完整的文档,请参阅http://code.google.com/p/junitparams/(它很容易在一页上显示)。

使用JUnitParams,传递给@Parameters注释的String []中包含的每个String都被解析为CSV并在逗号上拆分,然后从每个令牌中删除前导和尾随空格。标记的数量也必须与测试方法的参数数量相匹配。由于您需要包含null,空字符串和仅包含空格的字符串,因此您需要使用方法来提供参数,如下所示:

  private static final Object DEFAULT_VALUE = new String("It works!");
  private static final Object OTHER_VALUE = new String("It's broken!");

  private Object foo(String input) {
    Object output = DEFAULT_VALUE;
    if(input != null && !"".equals(input.trim())) {
      output = OTHER_VALUE;
    }
    return output;
  }

  @SuppressWarnings("unused")
  private Object[] parameters() {
    return $(
          new Object[] { null },
          new Object[] { "" },
          new Object[] { " " }
          // ,"Other value"
        );
  }

  @Test
  @Parameters(method = "parameters")
  public void testing(String input) {
    Object obj = foo(input);
    assertEquals(obj, DEFAULT_VALUE);
  }

原始问题中定义的三个测试将通过此示例代码,但如果您取消注释第四个值(“其他值”),则第四个测试将(正确)失败。