呐。 我现在,有一个 A 类要测试,里面有个属性是
private Map<String, Integer> aMap = new ConcurrentHashMap<String, Integer>();
现在我要用 PowerMock 测试他,需要修改一下,在测试初始的时候给 aMap 加一个值。
测试类这么写的 :
A a = A.getInstance();
Map<String, Integer> amap = new ConcurrentHashMap<String, Integer>();
countNumMap.put("Key", 120);
MemberModifier.field(A.class, "aMap").set(aMap, a);
结果报了异常:
java.lang.IllegalArgumentException: Can not set java.util.Map field A.aMap to java.util.concurrent.ConcurrentHashMap
at java.lang.reflect.Field.set(Field.java:764)
应该是反射机制要求我弄个 Map 类型的对象,而不是 ConcurrentHashMap,怎么破?求大佬指导~
搞定啦,使用Java 原生反射获取的Field 是可以 put 上一个 ConcurrentHashMap 的。如下:
Field field = A.class.getDeclaredField("aMap");
field.setAccessible(true);
field.set(a,aMap);
感觉可能是 PowerMock 或者 Mockito 封装的时候把 Field 搞坏了吧。。。
1
srx1982 2017-11-16 12:05:54 +08:00
下边的代码一个 amap 一个 aMap,你是抄错了还是怎么的
|
3
RLib 2017-11-16 13:49:15 +08:00
把 aMap 读出来 put 就行了, 为何要覆盖原来的 aMap
|
5
srx1982 2017-11-16 14:01:01 +08:00
试试看是不是要 setAccessible,因为这个 field 是 private 的
|
6
hqtc OP |