在没有 getter 和 setter 方法的情况下模拟/存根类的私有变量

Pra*_*ala 5 java mockito powermockito

我最近开始为现有项目开发 TDD 并面临几个问题,其中一个在下面提到

我有一个要在测试类中模拟的私有变量,该变量如下所示

private Class<XYZ> cls = XYZ.class;
Run Code Online (Sandbox Code Playgroud)

后来这个“cls”变量被用作类名方法之一的参数

private List create(Class className, Object objectTO,   List<String> names)
Run Code Online (Sandbox Code Playgroud)

我知道可以模拟私有变量,并且我按照以下步骤模拟了测试用例中的私有变量

  1. 声明了一个 java.lang.reflect.Field;
  2. Field field = PowerMockito.field(XYZ.class,"cls");
  3. field.set(XYZ.class, "objectOfXYZClass");

当我运行测试类时,出现以下错误

java.lang.IllegalArgumentException: Can not set java.lang.Class field com.tools.XYZ.cls to java.lang.Class
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
at java.lang.reflect.Field.set(Field.java:680)
Run Code Online (Sandbox Code Playgroud)

请有人帮我解决这个问题,让我知道我错过了什么。

PS:我使用@preparefortest并提到了所有必需的类,并使用运行我的测试类@runwith(powermockrunner.class)

Sar*_*eth 1

field.set(instanceOfClassXYZ, "")
Run Code Online (Sandbox Code Playgroud)

放入集合中,类的实例。不是上课。因为您正在将字符串“objectOfXYZClass”设置为对象。不进入班级;)我想补充一下

field.setAccessible(true);
Run Code Online (Sandbox Code Playgroud)