一个封装良好的类的TestNG测试类

时间:2015-12-29 11:45:26

标签: java unit-testing testng

我正在对具有以下结构的类进行单元测试。

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结构。 但我现在被困住,因为我的“地图”在我班上是“私人的”。 我不希望通过公开将我的状态变量暴露给外界。 请建议一种单元测试我的地图变量的方法。

3 个答案:

答案 0 :(得分:1)

您可以通过Reflection访问您的地图变量,但 NOT 是直接测试您的私人实施细节的好方法。更好的方法是测试依赖于私有东西的公共API 。在您的情况下测试getVal方法是否返回您添加到地图的相同值。 Read more on

答案 1 :(得分:1)

我个人所做的是将字段包私有化。我用Guava&#39; @VisibleForTesting注释它。

但这只是在我测试内部状态时。通常,您希望测试公共API(通常是publicprotected成员)提供的内容。

答案 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进行比较,以比较键值输入集。