我有一个方法,它采用域对象(一个非常复杂的嵌套对象树)作为参数,执行一些操作并返回结果。我需要为此方法创建 junit 测试,我需要将数据设置到复杂对象中。我想自动化为我的 junit 测试创建模拟数据的过程。我想要:在我的方法中调用的复杂对象树的那些对象/基元应该自动识别(通过分析代码)或其他)并应调用这些字段的 setter 。 如有任何帮助,我们将不胜感激。
最佳答案
我没试过PODAM (POjo Data Mocker),但它是一个“用虚构数据自动填充 pojo”的工具。
Pojo pojo = new PodamFactoryImpl().manufacturePojo(Pojo.class);
您可以检查一下 - 它似乎是可配置的,并且默认同时使用构造函数参数和 setter 。
如果您想尝试自己的/创建自己的测试实用程序,您可以按照这些思路做一些事情(-我承认“set”上的字符串检查有点难看:它可能是一种不是的方法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
关于java - 自动为 Junit 创建数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195486/