V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hqtc
V2EX  ›  Java

Java 反射, 类型相关

  •  
  •   hqtc · 2017-11-16 11:56:12 +08:00 · 2661 次点击
    这是一个创建于 2555 天前的主题,其中的信息可能已经有所发展或是发生改变。

    呐。 我现在,有一个 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,怎么破?求大佬指导~

    第 1 条附言  ·  2017-11-16 14:03:11 +08:00

    搞定啦,使用Java 原生反射获取的Field 是可以 put 上一个 ConcurrentHashMap 的。如下:

    Field field = A.class.getDeclaredField("aMap");
    field.setAccessible(true);
    field.set(a,aMap);
    

    感觉可能是 PowerMock 或者 Mockito 封装的时候把 Field 搞坏了吧。。。

    第 2 条附言  ·  2017-11-16 14:07:52 +08:00
    卧槽,原来是我之前 set 值得时候把 a 和 aMap 搞反了。。
    真 G2 丢人。
    求折叠。
    srx1982
        1
    srx1982  
       2017-11-16 12:05:54 +08:00
    下边的代码一个 amap 一个 aMap,你是抄错了还是怎么的
    hqtc
        2
    hqtc  
    OP
       2017-11-16 13:39:46 +08:00
    @srx1982 笔误,我就是在这里手写了一下,表达一下这个意思。。。公司业务代码的变量名还是不能暴露。~
    RLib
        3
    RLib  
       2017-11-16 13:49:15 +08:00
    把 aMap 读出来 put 就行了, 为何要覆盖原来的 aMap
    hqtc
        4
    hqtc  
    OP
       2017-11-16 13:59:12 +08:00
    @RLib 测试,打桩
    srx1982
        5
    srx1982  
       2017-11-16 14:01:01 +08:00
    试试看是不是要 setAccessible,因为这个 field 是 private 的
    hqtc
        6
    hqtc  
    OP
       2017-11-16 14:10:34 +08:00
    @srx1982 有道理。不过看了源码,PowerMock 获取 Field 已经干了这个事~

    哎问题原因是我自己 2 了,看第二条附言。。。
    srx1982
        7
    srx1982  
       2017-11-16 14:13:43 +08:00
    @hqtc 解决了就好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1430 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:36 · PVG 01:36 · LAX 09:36 · JFK 12:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.