有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JUnit使用不同输入的相同测试用例

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

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循环进行断言是否是一种好的做法


共 (1) 个答案

  1. # 1 楼答案

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

    对于JUnitParams,传递给@Parameters注释的字符串[]中包含的每个字符串都被解析为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);
      }
    

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