gpt4 book ai didi

java - 这是集成测试还是单元测试?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:26:14 25 4
gpt4 key购买 nike

这不仅仅是一个实际案例,这是我在尝试了解单元测试和集成测试之间的详细区别时遇到的一个问题。

假设我有 Sum 类,它将两个整数相加:

class Sum{
int x;
int y;
public int add(){
return x + y;
}
...getters and setters...
}

我还有另一个类负责验证结果,以确认这些值是否符合预期。举个例子,假设我们只想添加正数:

class ValidateSum{
Sum sum;
public boolean validate(){
if(sum.getX()>=0 and sum.getY()>=0){
return true;
}
else{
return false;
}
}
... getters and setters...
}

可能拥有 ValidateSum 没有多大意义,但为了示例起见,我们假设它。

现在我想为 ValidateSum 编写测试。如果我这样做:

@Test
public void testValidateSum(){
ValidateSum vs = new ValidateSum();
Sum sum = new Sum();
vs.setSum(sum);
boolean result = vs.validate();

assertTrue(result);
}

这是单元测试还是集成测试?

我知道单元测试只需要验证 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,以便它成为一个纯单元测试。但对于大多数情况,增加的复杂性成本和模拟属性 getter 所花费的努力并不值得仅仅为了获得“最纯粹”的单元测试,而在实践中,对于这种情况,单元测试和集成测试之间的区别是主观的。

最佳答案

不要模拟 Sum。 getter 和 setter 一般没有逻辑。模拟是删除一个类的逻辑的过程,这样它就不会干扰另一个类的测试。模拟一个没有任何逻辑的类,或者一个其逻辑不涉及当前测试的类是没有意义的。事实上,“不要模拟值对象”是众所周知的单元测试原则。

您的测试没有使用 Sum 类的任何逻辑。所以这是一个单元测试。

关于java - 这是集成测试还是单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com