我需要测试一种方法,例如:
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循环进行断言
答案 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);
}
原始问题中定义的三个测试将通过此示例代码,但如果您取消注释第四个值(“其他值”),则第四个测试将(正确)失败。