我有一个连接器类(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或类似的大小。那我该如何访问呢?
感谢。
答案 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