Java 我应该在什么条件下测试get()和set()方法?
我无法确定是否要做这些测试。似乎set-and-get方法非常简单,例如:Java 我应该在什么条件下测试get()和set()方法?,java,unit-testing,junit,Java,Unit Testing,Junit,我无法确定是否要做这些测试。似乎set-and-get方法非常简单,例如: setA(String A) { this.A = A; } getA(){ return A; } 任何想法都将不胜感激 谢谢, Joseph我说,它们都是一样的,就像空白接口或业务类一样。预处理应该启用所有需要的或它们是其他类型的(两者都应该像respond一样返回并接受2个变量的实践者)语言(即使现在无效的POSIX出口也应该使用参数,因为知道方法非常重要)进行成本/收益分析 它会得到什么
setA(String A) {
this.A = A;
}
getA(){
return A;
}
任何想法都将不胜感激
谢谢,
Joseph我说,它们都是一样的,就像空白接口或业务类一样。预处理应该启用所有需要的或它们是其他类型的(两者都应该像respond一样返回并接受2个变量的实践者)语言(即使现在无效的POSIX出口也应该使用参数,因为知道方法非常重要)进行成本/收益分析 它会得到什么
- 知道私有变量确实被读取/写入
- 编写测试用例所花费的时间
- 每次执行测试套件所花费的时间
如果你知道调用getter或setter没有明显的副作用,我就不麻烦了。为不会失败的方法编写测试用例对我来说似乎不成比例。 仅当A的值通过配置或某些可能失败的内容初始化时 这是值得测试的 编辑:
另一个测试有意义的例子是,如果帐户余额为负数,并且您希望在调用方法draw()后检查该标志是否设置正确,则标志“overdrawn”(透支) 一般规则:为getter和setter编写测试没有多大意义。只有当它们有一些额外的逻辑,即不是纯粹的访问器时,您才应该编写测试。是的,在您的情况下,它们是微不足道的-但另一方面-两个完全算作质量指标的简单测试;-) 我将创建测试。您的应用程序实际上依赖于方法真正存储/访问字段值并且不更改任何内容的行为
也许有一天,有人决定更改字段类型或向setter/getter添加一些单元转换代码-测试将显示,如果代码仍然有效,或者它将显示,需要做更多的工作。我在野外只看到了一些getter和setter的问题,其中只有一个可以通过单元测试检测到,只有这样,所有的getter和setter才能一起测试,而不是通过单独的测试方法 考虑从两个不同的getter/setter对重用相同字段的复制/粘贴错误。即
public void setA(Object a) {
this.a = a;
}
public Object getA() {
return a;
}
public void setB(Object a) {
this.a = a;
}
public Object getB() {
return a;
}
一次只关注一个setter/getter对的单元测试不会暴露问题
现代IDE将根据请求生成getter和setter,因此不太可能出现这种错误,但并非所有人都使用现代IDE。(一个vi用户创建了上面的bug。)如果这些方法驻留在一个简单的dataholder对象中,那么问题可能只会稍微远离原因
出于这个原因,如果我测试getter和setter(我通常不测试),它来自一个测试方法,该方法首先使用不同的值调用所有setter,然后在所有getter上断言
但是,您必须面对的一个问题是,当其他人获得代码并决定(比如)时,无法保证一个以“简单”getter或setter开始生命的方法会保持这种状态,getter是一个很好的地方,它可以做一些涉及到副作用的事情。我唯一一次专门为set()和get()方法编写测试,就是它们内部是否有某种逻辑。将整数限制在1到8之间
public void SetA(int a)
{
if(a > 8 || a < 1)
{
throw new IndexOutOfBoundsException();
}
this.a = a;
}
公共无效SetA(INTA)
{
如果(a>8 | | a<1)
{
抛出新的IndexOutOfBoundsException();
}
这个a=a;
}
尽管上面的代码是一个非常简单的示例,但当您执行这种类型的逻辑时,最好对它们运行测试。主要用于当您的业务规则发生变化时,您必须将其限制在9到1之间:)单元测试应该是系统如何工作的文档。尽管人们经常跳过属性的单元测试,因为功能微不足道, 如果测试是文档,特别是如果其他人要执行,那么应该编写属性测试。
这就是说,当我编写测试和执行实现时,我通常会跳过为属性编写测试,除非它们做的不仅仅是简单的get/set,或者如果我有空闲时间,这是一件罕见的事情。一个聪明人曾经说过“测试直到恐惧变成无聊”。如果您不再担心超级简单的代码会被破坏,那么不要编写测试,除非您不厌倦编写这些测试。不要仅仅为了“改进你的指标”而编写测试,那只是在游戏系统。编写测试以确保您的代码正常工作,提高健壮性,并创建您可以自由重构的信心。如果它们不是纯粹的访问器,那么将它们作为getter和setter(imho)可能会产生误导。让getter和setter做任何事情都是不允许的,但是设置私有变量并不是真正意义上的封装形式-您还可以使用公共字段@史蒂文:这条线很模糊。在某些情况下,副作用的程度会导致“accessoor”不是一个准确的术语。例如,当属性的设置必须触发事件时,setter需要执行其他操作。当然,这个案例应该包含测试。我认为这个属性无论如何都会在其他测试案例中使用。如果没有,它就不应该存在。bean的一个实际折衷方案是:一个覆盖所有“琐碎”getter和setter的测试。但是公共方法是类的接口,因此应该经过测试和可靠。