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