如何使用反射访问JUnit中的私有Map?

时间:2011-11-15 08:51:24

标签: java testing reflection junit

我有一个连接器类(SVNConnector),应该进行junit测试。有一个名为private Map<String, SVNRepository> connectionMap的私有映射,应该在JUnit中访问,但是这个映射没有getter方法。所以我必须用反射来做到这一点。我的问题是:这是如何工作的?我尝试了以下方法:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
    svnConnector = new SVNConnector(user, pwd);
    Field connectionMapField = SVNConnector.class.getDeclaredField("connectionMap");
    connectionMapField.setAccessible(true);
//AND NOW?
}

没有任何Collection特定的getter或setter来检查collectionMap或类似的大小。那我该如何访问呢?

感谢。

4 个答案:

答案 0 :(得分:2)

你是说你想获得该领域的价值吗?

Map<String, SVNRepository> connectionMap = 
    (Map<String, SVNRepository>) connectionMapField.get(svnConnector);

答案 1 :(得分:1)

从字段中获取引用(使用Field.get(Object)方法),将其转换为Map然后使用它。

Map connectionMap = (Map) connectionMapField.get(svnConnector);

int size = connectionMap.getSize();

您还可以查看Java Reflection Tutorial

答案 2 :(得分:1)

查看JUnit-addons。

特别是 - http://junit-addons.sourceforge.net/junitx/util/PrivateAccessor.html

主页在这里 - http://junit-addons.sourceforge.net/

例如:

PrivateAccessor.setField(myClassInstance, "privateMapName", myMap);

答案 3 :(得分:0)

如果您想使用其他库(和注释处理器),您可以使用dp4j@TestPrivate注释:

    @TestPrivates
    @BeforeClass
public static void setUpBeforeClass() throws Exception {
    svnConnector = new SVNConnector(user, pwd);
    Map<String, SVNRepository> connectionMap = svnConnector.connectionMap; 
/* dp4j will replace this plain access the equivalent Reflection API code at compile-time */
    }

您还可以使用-Averbose选项查看生成的反射代码,将其复制粘贴,然后删除@TestPrivates