unit-testing - mock 还是不 mock ?

标签 unit-testing mocking

关闭。这个问题是off-topic .它目前不接受答案。












想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。

10年前关闭。




Improve this question




据我从极限编程和单元测试中了解到,测试必须由另一个开发人员在另一个开发人员开发测试方法之前完成(或者来自同一个开发人员,但测试必须在方法实现之前编写)。

好的,看起来不错,我们只需要在我给它一些参数时测试一个方法是否具有良好的行为。

但理论与实践的区别在于,理论上没有,但在实践中……

我第一次尝试测试时,由于对象之间的关系,我发现在某些情况下很难。我发现了模拟练习,我发现它非常有用,但有些概念让我怀疑。

首先,模拟隐式表示:“您知道该方法如何运行,因为您必须知道它需要哪些其他对象......”。好吧,理论上是我的 friend bob 编写了测试,他只知道当我给它“john”字符串时该方法必须返回 true ......内存中的哈希表...

我可怜的 friend Bob 将如何编写它的测试?他会期待我的工作...

好吧,似乎不是纯粹的理论,但没关系。但是,如果我查看许多模拟框架的文档,它们允许我测试一个方法被调用的次数和顺序!哎哟...

但是如果我的 friend Bob 必须这样测试这个方法以确保良好地使用依赖项,那么该方法必须在测试之前编写,不是吗?

嗯...帮助我的 friend 鲍勃...

我们什么时候停止使用模拟机制(订单验证等)?
什么时候模拟机制有用?
理论、实践和模拟:什么是最好的平衡?

最佳答案

您的描述中似乎缺少的是将契约(Contract)与实现分开的概念。在 C# 和 Java 中,我们有接口(interface)。在 C++ 中,仅由纯虚函数组成的类可以充当此角色。这些并不是真正必要的,但有助于建立逻辑分离。因此,与您似乎正在经历的困惑相比,实践应该更像:Bob 为一个特定的类/功能单元编写单元测试。在这样做的过程中,他为支持这一接口(interface)所需的其他类/单元定义了一个或多个接口(interface)(契约)。他现在不需要编写这些,而是​​用模拟对象填充它们,以提供他的测试和被测系统所需的间接输入和输出。因此,一组单元测试的输出不仅仅是驱动单个单元开发的测试,而且还包括需要由其他代码实现以支持当前正在开发的单元的契约(Contract)。

关于unit-testing - mock 还是不 mock ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6875173/

相关文章:

database - 如何模拟 ping 命令

c# - 如何在具有多个间接级别的项目中使用单元测试

Android:如何在单元测试期间重置/清除应用程序首选项?

unit-testing - symfony 的 PHPUnit Mock RequestStack

java - 如何使用 Mockito 模拟带有 @InjectMock 注释的对象

unit-testing - WebStorm 运行所有 dart 单元测试

php - 如何模拟内置的 php 套接字函数?

c# - 无法理解如何在单元测试中使用 Mock

c++ - 如何获取 JUnit 格式的 CMocka 报告?

unit-testing - 可以卡住函数的模拟吗?