java - TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的?

标签 java testing mocking tdd

this thread ,布赖恩(唯一的回答者)说“你的代码应该以与测试无关的方式编写”

单个评论说“您的代码绝对不应该在全局“我正在测试标志”上分支。”。

但两者都没有给出理由,我真的想听听关于此事的一些理性想法。进入给定的应用程序类并设置一个 boolean 值来表示“这是一个测试,而不是运行”将非常容易(特别是考虑到许多测试对应用程序类具有包私有(private)访问权限这一事实)。

我发现自己千方百计(注入(inject)模拟的私有(private)字段等)来实现的各种事情都可以变得更容易完成。

同样明显的是,如果你走得太远,那将是灾难性的......但作为软件测试军械库中众多工具中的一种,为什么这个概念会受到如此多的谴责?

米克助记符的答案:

如果您实际上在方法中间创建一个新的类实例并将其分配给私有(private)字段,那么这可能有什么帮助的一个简单示例:私有(private)字段模拟在这种情况下无济于事,因为您是替换私有(private)字段。但实际上创建真实对象的成本可能非常高:您可能希望在测试时将其替换为轻量级版本。

事实上,我昨天遇到了这样的情况……我的解决方案是创建一个名为 createXXX() 的新包私有(private)方法……这样我就可以模拟它。但这反过来又违背了格言“你不能仅仅为了适合你的测试而创建方法”!

最佳答案

想想大众汽车的大丑闻。在测试下与在生产负载下表现不同的系统并没有真正经过测试。也就是说:它实际上是 两个 系统,即生产系统和测试系统 - 其中唯一经过测试的是测试系统。不同的生产系统未经过测试。您在两个系统之间引入的每个行为差异都是一个测试漏洞。

关于java - TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41860777/

相关文章:

java - 正则表达式问题

javascript - 如何使用导入构造函数的外部库的 Jest 来测试模块

testing - 试图在 Flask-SQLAlchemy 中模拟模型的问题

java - 类型为 ="xsd:base64Binary"的 Axis Web 服务

java - 调用正确的包装器

java - android解析负数字符串

python - 测试 python 备忘录装饰器

Laravel:带有点击功能的单元测试

c# - 模拟流以读取字节[]

java - 如何模拟对象构造?