【发布时间】:2013-03-18 21:10:43
【问题描述】:
我想使用反射设置私有字段的值以进行单元测试。
问题是,该字段是静态的。
这是我的工作内容:
/**
* Use to set the value of a field you don't have access to, using reflection, for unit testing.
*
* Returns true/false for success/failure.
*
* @param p_instance an object to set a private field on
* @param p_fieldName the name of the field to set
* @param p_fieldValue the value to set the field to
* @return true/false for success/failure
*/
public static boolean setPrivateField(final Object p_instance, final String p_fieldName, final Object p_fieldValue) {
if (null == p_instance)
throw new NullPointerException("p_instance can't be null!");
if (null == p_fieldName)
throw new NullPointerException("p_fieldName can't be null!");
boolean result = true;
Class<?> klass = p_instance.getClass();
Field field = null;
try {
field = klass.getDeclaredField(p_fieldName);
field.setAccessible(true);
field.set(p_instance, p_fieldValue);
} catch (SecurityException e) {
result = false;
} catch (NoSuchFieldException e) {
result = false;
} catch (IllegalArgumentException e) {
result = false;
} catch (IllegalAccessException e) {
result = false;
}
return result;
}
我意识到这可能已经在 SO 上得到了回答,但我的搜索没有出现...
【问题讨论】:
-
显而易见的答案是“Jasus,不要改变其他类的静态或私有数据。”您可以尝试从上方进行参数化。
-
如果您使用的是 spring,您可以在私有字段上设置 @Autowired,然后如果您需要用模拟替换该实例,您需要使用测试方法中的反射来更改它
标签: java unit-testing reflection