当前位置: 首页 > 知识库问答 >
问题:

一个人如何写一个好的单元测试而不嘲笑一切?

司空俊雄
2023-03-14

我读到过嘲弄一切是不好的
测试气味:一切都被嘲弄
嘲弄一切是一个好办法

我还读到单元测试关注单个组件,而集成测试则测试整个系统的协同工作<编写优秀的单元测试:最佳和最差实践

这让我困惑。据我所知,要编写一个合适的单元测试,需要通过模拟除SUT之外的所有组件来隔离单个组件。如果在整个测试过程中使用真实对象,那么该测试不是成为一个集成测试吗?

一个人如何编写一个好的(独立的)单元测试而不去嘲笑一切?

共有1个答案

冯宏恺
2023-03-14

嘲弄模特是一种难闻的气味。您应该只模拟参与测试方法逻辑的依赖项,而不是数据。但即使有这个简单的规则,事情也并不总是显而易见的。

在某些情况下,单元测试方法是直接的,因为该方法有自己的逻辑规则,并且有一个或两个对不同外部依赖的调用来完成其逻辑。在这种情况下,嘲笑似乎很自然。

在其他一些情况下,单元测试不那么明显,因为测试方法几乎没有逻辑规则。它在实现中主要调用外部依赖项。在这种情况下,模仿似乎真的很不自然,因为测试的本质可能是模仿。通过模拟每个调用来测试流调用是在测试一个白盒。它很脆弱,因为它不能测试方法的逻辑行为。它只证明了一件事:你的代码做了它所做的事情。

在这种情况下,我认为集成测试应该优于单元测试。

 类似资料:
  • 我想在同一个类中模拟一个void方法,这个方法正在用mockito测试中。我可以用@spy注释not void方法,然后使用下面的代码返回我想要的数据。 每个依赖项都是用@mock模拟的。

  • 我有一个类,我将Symfony\Component\HttpClient\HttpClient的实例作为构造函数参数注入其中。 我正在看https://symfony.com/doc/current/components/http_client.html#testing-http-clients-and-responses的留档页面,建议使用作为创建Mock客户端的一种方式。 当我把模拟的客户端传

  • 我需要测试一些遗留代码,这些代码在a方法调用中使用了单例。测试的目的是确保类sunder测试对singletons方法进行调用。我在SO上看到过类似的问题,但所有的答案都需要其他依赖项(不同的测试框架)--不幸的是,我仅限于使用Mockito和JUnit,但对于这样流行的框架,这应该是完全可能的。 单身人士: 正在测试的类: 单元测试: 这个想法是配置可怕的单例的预期行为,因为被测试的类将调用它的

  • 为了让单元测试跑一个批处理的任务,这个框架必须加载这个任务的ApplicationContext,两个注解的触发方式: @RunWith(SpringJUnit4ClassRunner.class):表明这个类需要使用Spring的测试工具 @ContextConfiguration(locations = {…}):表明哪些xml文件包含ApplicationContext @RunWith

  • 原始关闭原因未解决 有人告诉我@Mock通常只用于单元测试,但我认为它对于替换测试类之外的外部部分很有用。在集成测试中模拟是正确的吗?

  • 我有使用vue cli 3的vue应用程序。在安装过程中,我选择了jest作为测试框架。要运行我的单元测试,我在package.json中有一个脚本: 要运行这个我写在vs代码终端: 这将运行所有符合package.json文件jest配置部分中设置的规范的测试。 我的问题是如何只运行一个测试。我需要运行特定的命令吗?或者是否有一个vscode扩展将与此设置一起工作。