如何在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或类似的大小。那么我怎么访问它呢?

谢谢。

您的意思是您想获得字段的值吗?

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

查看junit插件

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

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

例如:

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

获取字段的引用(通过使用field .get(Object)方法),将其强制转换为Map,然后使用它。

Map connectionMap = (Map) connectionMapField.get(svnConnector);
int size = connectionMap.getSize();

你可能还应该看看Java反射教程

如果您喜欢使用其他库(和注释处理器),则可以使用dp4j的@TestPrivate s注释:

    @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

相关内容

  • 没有找到相关文章

最新更新