【问题标题】:JUnit Same testcase with different inputs [duplicate]JUnit具有不同输入的相同测试用例[重复]
【发布时间】:2013-12-05 00:36:00
【问题描述】:

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

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

对于上述方法,一个测试用例涉及 input = {null, " ", "", etc} 将返回相同的默认对象,并且还有其他测试用例

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

或者我可以这样做吗,

@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 循环用于断言是否是一种好习惯

【问题讨论】:

    标签: java unit-testing junit


    【解决方案1】:

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

    使用 JUnitParams,传递给 @Parameters 注释的 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);
      }
    

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

    【讨论】:

    • 我正在尝试使用类似 @Parameters({null, "", " "}) 但错误为 null 并且当我删除 null 时,它会抛出非法Arg 异常,说它“无法解析参数,你是否作为分隔符”。我们不能在@Param 中使用 null、空字符串和空格吗,有替代方法吗
    • 我已经用一些代码更新了我上面的答案,以帮助您入门。我还在 JUnitParams 项目 (code.google.com/p/junitparams/issues/detail?id=51) 中包含了相应问题的链接。
    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多