【问题标题】:TestNG test class for a well encapsulated class封装良好的类的 TestNG 测试类
【发布时间】:2015-12-29 11:45:25
【问题描述】:

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

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 结构。 但我现在被困住了,因为我的“地图”在我的课堂上是“私人的”。 我不想通过公开将我的状态变量暴露给外界。 请提出一种对我的地图变量进行单元测试的方法。

【问题讨论】:

    标签: java unit-testing testng


    【解决方案1】:

    您可以通过Reflection 访问您的地图变量,但直接测试您的私有实现细节不是一个好习惯。更好的方法是测试依赖于私有内容的公共 API。在您的情况下,测试 getVal 方法是否返回您添加到地图中的相同值。 Read more on.

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果Experiment 是一个类似地图的对象,您可以扩展使用google/guava 并扩展ForwardingMap。详情请参阅CollectionHelpersExplained · google/guava Wiki 中的Forwarding Decorators

        例如

        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 进行比较,以比较键值条目集。

        【讨论】:

          猜你喜欢
          • 2011-06-14
          • 1970-01-01
          • 2015-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 1970-01-01
          相关资源
          最近更新 更多