gpt4 book ai didi

java - 我应该模拟我的测试对象与之交互的所有对象吗?

转载 作者:行者123 更新时间:2023-11-29 08:40:32 25 4
gpt4 key购买 nike

我很难知道如何决定应该模拟与我的测试对象交互的对象。

class MyClass {
private Customer customer;
private Invoice invoice;
private PrintService ps;
private DBAccessService da;
private EmailService em;
..........
}

我可以看到最后 3 个要被模拟,因为它们处理一些外部系统。客户和发票呢?如果不是,为什么?

最佳答案

“我应该模拟我的测试对象与之交互的所有对象吗?”这个问题的一般答案。是一个响亮的:这不是您应该内化或遵循的规则。模拟是测试替身的多种类型之一,您必须判断在哪里使用模拟,在哪里使用其他假冒或测试替身,以及在哪里使用真正的合作者。我同意您的决定,即最后三个字段(服务)可能值得 mock ,如果由我决定,我会为前两个字段(客户和发票)使用真实对象。

在这里,我会坚持一条准则,不要模拟数据对象,这是根据一些观察得出的:

  • 数据对象通常非常有状态,模拟框架往往对状态 stub 很差。 Mockito 对于“getX 无限期返回 15,直到您调用 setX(20),然后 getX 返回 20”,Mockito 并没有很好的语法.因此,正确地 stub 通常很困难。

  • 对于只是字段/getter/setter 的数据对象,验证无法通过从实际实现中读取可变状态来完成的值(value)不大。只要对象中的值被读取,谁在乎是否调用了 getY?谁在乎 setY 被调用了多少次,只要正确的值最终出现在对象中就可以了?因此,验证通常是不必要的。

  • 数据对象通常在使用它们的对象之前写入,因此通常已经存在一个可用的实现。

  • 数据对象通常具有确定性行为,外部交互很少,因此在提高测试稳定性或减少测试不稳定方面通常收效甚微。

作为biziclop问题评论中提到,

always remember what the purpose of automated testing is: to find errors in the shortest possible time with the smallest possible effort. Or to turn it around: to build up confidence about the correctness of your code.

从这个意义上说,模拟数据对象对测试的可读性和正确性有很高的成本,而且也不太可能在测试正确性或稳定性方面带来好处。我会避免它。

关于java - 我应该模拟我的测试对象与之交互的所有对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40595344/

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