我有一个连接器类(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