关于java:如何使用JUnit的公共getter和私有setter来测试一个类?

How to test a class only with public getters and private setters with JUnit?

让我们说我们有以下课程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 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仅用于测试目的是否有效?

谢谢你的帮助...


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

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


不能从您的单元测试用例中调用您的私有方法。所以要么你必须公开它,要么默认或保护(如果你把它放在同一个包中)。您通常不测试私有方法,因为它们只能(通常)通过另一个公共方法间接测试。当你试驾并制作私人方法时,它们通常是"提取方法"重构的结果,并且已经被间接测试。


你不应该将setter设为私有,因为setter的目的是让程序员实现一个类,将他们想要的值设置到类的字段中。由于字段已经是私有的,因此拥有私有设置器是多余的。如果您没有要变异的字段,则将字段保留为私有字段,不要为这些字段创建setter。

1
So yes is the answer to your question.

如果你有理由不让你的setter公开,那么你可以使用一个参数化的构造函数,它在创建这个类的对象时启动带有作为参数传递的值的字段,并在实例化对象时调用参数化构造函数。