我正在对具有以下结构的类进行单元测试。
public class Experiment {
private final Map<String,String> map = new HashMap<>();
Experiment(Set<String> set){
for(String str :set ){
map.put(str,str);
}
}
public String getVal(String str){
return map.get(str);
}
}
如我所见,我的类只有一个实例变量是HashMap。现在我想确保我的地图通过我的构造函数正确填充,该构造函数采用HashSet。 因为我可以独立创建一个预期的Map结构。 但我现在被困住,因为我的“地图”在我班上是“私人的”。 我不希望通过公开将我的状态变量暴露给外界。 请建议一种单元测试我的地图变量的方法。
答案 0 :(得分:1)
您可以通过Reflection
访问您的地图变量,但 NOT 是直接测试您的私人实施细节的好方法。更好的方法是测试依赖于私有东西的公共API 。在您的情况下测试getVal
方法是否返回您添加到地图的相同值。 Read more on
答案 1 :(得分:1)
我个人所做的是将字段包私有化。我用Guava&#39; @VisibleForTesting
注释它。
但这只是在我测试内部状态时。通常,您希望测试公共API(通常是public
和protected
成员)提供的内容。
答案 2 :(得分:1)
如果Experiment
是一个类似地图的对象,您可以扩展使用google/guava
并扩展ForwardingMap
。有关详细信息,请参阅Forwarding Decorators中的CollectionHelpersExplained · google/guava Wiki。
e.g。
public class Experiment extends ForwardingMap<String,String> {
private final Map<String,String> map;
Experiment(Set<String> set){
Map<String,String> map = new HashMap<>();
for(String str :set ){
map.put(str,str);
}
this.map = Collections.unmodifiableMap(map);
}
@Override
protected Map<String, String> delegate() {
return map;
}
public String getVal(String str){
return map.get(str);
}
}
这会使Experiment
实施Map
,以便您可以公开调用get(Object)
,containsKey(Object)
,entrySet()
等内容,但可以调用任何修饰符方法像put(String, String)
一样会抛出异常。然后,您可以将Experiment
与测试中的任何其他Map
进行比较,以比较键值输入集。