【问题标题】:How to test a class only with public getters and private setters with JUnit?如何仅使用 JUnit 的公共 getter 和私有 setter 测试一个类?
【发布时间】:2015-05-07 17:57:03
【问题描述】:

假设我们有以下课程:

 package com.porphyrie.examples;

public class TestExample {

    private String name;
    private int id;

    public TestExample() {
        setName("testExample");
        setId(3); 
    }


    public String getName() {
        return name;
    }
    private void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    private void setId(int id) {
        this.id = id;
    }

}

我应该如何测试这个类?由于eclipse只想测试公共方法,我应该如何在不设置setter的情况下测试getter?将上述类中的private setter-methods 设置为public 是否仅用于测试目的?

感谢您的帮助...

【问题讨论】:

标签: java unit-testing testing junit


【解决方案1】:

您的示例代码是一个很好的代码示例,它不是为实现简单的单元测试而编写的。如果您采用必须以一种更容易测试的方式设计/构造/编写代码的心态,那么您就不应该有这些问题。简短的回答是,是的,将 setter 公开以启用您的测试,或者如果您不希望 setter 成为公共 api 的一部分,则为包/默认范围。

或者,您可以添加另一个带参数的构造函数,以便在创建实例时为您设置值。

【讨论】:

    【解决方案2】:

    您不应该将 setter 设为私有,因为 setter 的目的是让实现类的程序员将他们想要的值设置到类的字段中。由于字段已经是私有的,因此拥有私有 setter 有点多余。如果您不知道要更改哪些字段,则将字段保留为私有,并且不要为这些字段创建设置器。

    So yes is the answer to your question.
    

    如果您有理由不公开您的设置器,那么您可以使用参数化构造函数,该构造函数在创建此类对象时使用作为参数传递的值来初始化字段,并在实例化对象时调用参数化构造函数。

    【讨论】:

      【解决方案3】:

      不,您的私有方法不能从您的单元测试用例中调用。因此,您必须将其设为公开或默认或受保护(如果您已将其放在同一个包中)。您通常不测试私有方法,因为它们只能(通常)通过另一个公共方法间接测试。当您测试驾驶并创建私有方法时,它们通常是“提取方法”重构的结果,并且到那时已经间接测试了。

      【讨论】:

        猜你喜欢
        • 2017-06-27
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        相关资源
        最近更新 更多