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? 将上面的类中的
谢谢你的帮助...
您的示例代码是一个很好的代码示例,不能编写代码来实现简单的单元测试。如果您采用的思维方式必须以一种让您更容易测试的方式设计/构造/编写代码,那么您就不应该有这些问题。简短的回答,是的,如果您不希望setter成为公共API的一部分,那么将setter公开为启用您的测试或包/默认范围。
或者,您可以添加另一个带参数的构造函数,以便在创建实例时为您设置值。
不能从您的单元测试用例中调用您的私有方法。所以要么你必须公开它,要么默认或保护(如果你把它放在同一个包中)。您通常不测试私有方法,因为它们只能(通常)通过另一个公共方法间接测试。当你试驾并制作私人方法时,它们通常是"提取方法"重构的结果,并且已经被间接测试。
你不应该将setter设为私有,因为setter的目的是让程序员实现一个类,将他们想要的值设置到类的字段中。由于字段已经是私有的,因此拥有私有设置器是多余的。如果您没有要变异的字段,则将字段保留为私有字段,不要为这些字段创建setter。
1 | So yes is the answer to your question. |
如果你有理由不让你的setter公开,那么你可以使用一个参数化的构造函数,它在创建这个类的对象时启动带有作为参数传递的值的字段,并在实例化对象时调用参数化构造函数。