如何使用 JUnit 仅使用 public getter 和私有 setter 测试 class?

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

假设我们有以下 class:

 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;
    }

}

我应该如何测试这个 class?由于 Eclipse 只想测试 public 方法,我应该如何在不设置 setter 的情况下测试吸气剂?将上面class中的private setter-方法设置为public仅用于测试目的是否有效?

感谢您的帮助...

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

So yes is the answer to your question.

如果您有理由不创建设置器 public,那么您可以使用参数化构造函数,它在创建此 class 的对象时使用作为参数传递的值来启动字段,并且实例化对象时调用参数化构造函数

您的示例代码是一个很好的代码示例,它不是为实现简单的单元测试而编写的。如果您采用的心态是您必须 design/structure/write 以一种更容易测试的方式编写代码,那么您就不应该有这些问题。简短的回答,是的,将设置器公开为 public 以启用您的测试,或者如果您不想要 public api.[=10 的设置器部分,则将设置器公开为 package/default 范围=]

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

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