自动为Junit创建数据

时间:2016-03-24 07:58:40

标签: java junit automation mocking

我有一个方法,它接受一个域对象(一个非常复杂的嵌套对象树)作为参数做一些操作并返回一个结果。我需要为这个方法创建junit测试,我需要将数据设置到复杂对象中。我想自动化为junit测试创建模拟数据的过程。我想要:应该自动识别在我的方法中调用的复杂对象树的那些对象/原语(通过分析代码或者其他)并且应该调用这些字段的setter。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我还没有尝试PODAM(POjo Data Mocker),但它是一个“用化妆数据自动填充pojos”的工具。

Pojo pojo = new PodamFactoryImpl().manufacturePojo(Pojo.class);

你可以检查一下 - 它似乎是可配置的,并且默认使用构造函数参数和setter。

如果你想尝试自己的/创建自己的测试实用程序,你可以沿着这些方向做一些事情( - 我承认对“set”的字符串检查有点难看:它可能是一个非NOT的方法一个setter。逻辑可以扩展:下一个字符是大写吗?它是否与字段名称匹配?)

public void populateObjectWithRandomValuesUsingReflection(Object object) {
    List<Object> argsList;
    for (Method method : object.getClass().getMethods()){
        argsList = new ArrayList();
        if (resemblesASetterMethod(method)){
            for (Class<?> parameterClass : method.getParameterTypes()){
                if (parameterClass.isPrimitive()){
                    argsList.add(getRandomValueOfPrimitive(parameterClass));
                } else {
                    throw new UnsupportedOperationException("This jUnit test utility does not yet support non-primitive types.");
                }
            }
            invokeMethod(method, object, argsList.toArray());
        }
    }
}

private void invokeMethod(Method method, Object object, Object[] args) {
    try {
        method.invoke(object, args);
    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
        Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private boolean resemblesASetterMethod(Method method){
    return method.getName().startsWith("set");
}

以上示例仅支持原语,但同样,您可以扩展此示例代码。

对于创建(伪)随机值,有框架,fx:

  • org.apache.commons.lang.RandomStringUtils
  • java.util.Random中