pfe*_*dom 3 java testing integration-testing unit-testing mocking
不仅仅是一个实际案例,这是我在试图获得单元测试和集成测试之间的详细差异时遇到的问题.
假设我有类Sum,它增加了两个整数:
class Sum{
int x;
int y;
public int add(){
return x + y;
}
...getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
我还有另一个负责验证结果的类,以确认值是预期的.仅举例来说,假设我们只想添加正数:
class ValidateSum{
Sum sum;
public boolean validate(){
if(sum.getX()>=0 and sum.getY()>=0){
return true;
}
else{
return false;
}
}
... getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
拥有ValidateSum可能没有多大意义,但我们只是为了举例而假设它.
现在我想为ValidateSum编写测试.如果我这样做:
@Test
public void testValidateSum(){
ValidateSum vs = new ValidateSum();
Sum sum = new Sum();
vs.setSum(sum);
boolean result = vs.validate();
assertTrue(result);
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试还是集成测试?
我知道单元测试只需验证ValidateSum中的功能,并且在某种程度上测试是这样做的:它只从Sum获取属性,而不是它的任何功能.
但另一方面,你也可以说你正在从Sum访问功能,即使ValidateSum只调用一个getter.Sum的getter的任何变化都会影响ValidateSum的测试,打破了单元测试的概念.
但如果是这种情况并且确实是集成测试,那么我如何为ValudateMethod的validate()编写单元测试?
我唯一想不到的是嘲笑Sum,所以它返回相同的值.即使Sum的getter中的逻辑发生变化,ValidateSum的测试也将保持不变.问题是,getter的模拟响应可能会增加不必要的复杂性,因为getter中逻辑更改的可能性非常低,而我们所做的只是获取属性.
我希望我的问题有道理,这更多是理论上的疑问.
编辑
谢谢您的回答.他们有重要的事情需要考虑.我选择的最佳答案之一是因为它引导我:
http://www.mockobjects.com/2007/04/test-smell-everything-is-mocked.html
它是真的:从理论上讲,我必须模拟Sum,这样才能成为一个纯粹的单元测试.但是对于大多数情况来说,增加复杂性的成本以及模拟属性获取者所花费的精力并不值得进行"最纯粹的"单元测试,而在实际情况下,单元和集成测试之间的差异是主观的.
不要嘲笑Sum
.一般来说,吸气剂和制定者没有逻辑.模拟是删除类逻辑的过程,因此它不会干扰另一个类的测试.模拟没有任何逻辑的类,或者逻辑与当前测试无关的类是没有意义的.事实上,"不要模拟价值对象"是众所周知的单元测试原则.
您的测试没有使用Sum
该类的任何逻辑.所以这是一个单元测试.
归档时间: |
|
查看次数: |
236 次 |
最近记录: |