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

在集成测试中嘲笑被认为是一个好的实践吗?[关闭]

劳嘉实
2023-03-14

原始关闭原因未解决

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

共有3个答案

慕兴平
2023-03-14

在集成测试中嘲笑是正确的吗?

一般情况:你不能在集成测试中嘲笑

一般来说,模拟测试和集成测试并不适合一起使用<大多数时候,你想用一个或第二个,而不是两个都用。

但有时您希望在集成测试中进行模拟,因为您想要断言的逻辑只能在此框架中进行正确测试

如果您依赖于一个框架或一个库,它为您执行许多事情,并且您需要测试您在该框架中指定的逻辑,那么您将通过编写比单元测试更多的集成测试来完成,因为单元测试通常不足以覆盖
但是完全集成测试与其他组件完全没有隔离(所以副作用是可能的:测试可能会因为不好的原因而成功),这些测试通常很慢,所以通常不会在提供延迟的本地机器上执行
所以只编写完整集成测试通常是不可接受的。对于这种上下文,在集成测试期间模拟的想法非常有意义。

Spring Boot和测试片:一个很好的例子

由Spring Boot启动的应用程序属于这一类
实际上,我们希望运行容器,以便能够测试某些特定部分(持久性、控制器等),但不希望加载整个容器和相关组件<所以嘲笑某些特定的部分是很有意义的
和Spring Boot的测试片允许在测试组件处于某种集成级别时进行模拟:

Spring Boot的自动配置系统在应用程序中运行良好,但有时对测试来说可能有点太多。只加载测试应用程序“切片”所需的配置部分通常会有所帮助。例如,您可能希望测试Spring MVC控制器是否正确映射URL,并且不希望在这些测试中涉及数据库调用,或者您可能希望测试JPA实体,并且在这些测试运行时对web层不感兴趣

公良扬
2023-03-14

是的,在有些情况下,您可以在集成测试中使用@Mock(主要是为了存根)。尤其是如果你想集成测试你的课的一部分。

例如,如果您想测试与外部服务A的通信,那么模仿与服务B通信有关的其余部分并没有什么错。

另一个例子是,如果您测试工作流,那么有必要进行集成测试,通过模拟单个步骤/活动来测试路径。

个人观点(有争议,有很多不同的术语):单元测试和集成测试有很多不同的层次。在我看来,单元测试只是孤立地测试单个类。但我经常编写测试几个类的组合,在我看来,这已经是一种集成测试。还有一些测试可能通过模拟外部服务来测试单个组件,我称之为系统测试。然后可能会有一些测试,针对未被模拟的外部服务测试单个组件,我称这些测试为系统集成测试。在所有这些场景中,模拟/存根某些部分并在单个测试类中关注一个方面可能是可行的。

张茂勋
2023-03-14

最后,这都是关于措辞的。

当你想到“正确”这个最基本的概念,比如正确性时,答案很简单:不。

您可以看到,集成测试的目标是确保您的集成系统(由多个不同组件组成)按预期运行。集成测试的目的是验证组件的“管道”是否按预期工作。因此:当系统的某些部分被模拟出来时,您无法验证系统是否工作。

但是,你可以不那么严格地思考“正确性”。

示例:销售汽车的公司必须测试ECU。基本上是一块硬件,运行着一个潜在的巨大软件堆栈。这些ECU通常在车内运行。所以当你想集成测试一个ECU时,你必须把ECU放进车里进行测试,对吗?一辆可能还不存在的车。这里的解决方案是:有硬件模拟器。你把电子控制单元插入模拟器,电子控制单元就会“思考”一辆真正的汽车。

所以:有很好的论据声称“一个真正的集成测试不能使用嘲讽”,但与此同时,在现实世界中,这样的“嘲讽”一直在发生。

因此,真正的答案是:这取决于背景。因此,没有一个普遍的答案。相反,这是关于沟通。你“简单地”必须确保你的团队/组织中的所有人对这些术语有相同的理解。

术语本身可以用不同的方式解释。你们(共同!)选择最适合您需求的定义,然后确保所有为您的项目做出贡献的人都共享该视图(或者至少了解该视图)。

 类似资料:
  • 我读到过嘲弄一切是不好的 测试气味:一切都被嘲弄 嘲弄一切是一个好办法 我还读到单元测试关注单个组件,而集成测试则测试整个系统的协同工作<编写优秀的单元测试:最佳和最差实践 这让我困惑。据我所知,要编写一个合适的单元测试,需要通过模拟除SUT之外的所有组件来隔离单个组件。如果在整个测试过程中使用真实对象,那么该测试不是成为一个集成测试吗? 一个人如何编写一个好的(独立的)单元测试而不去嘲笑一切?

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

  • 我目前正在做一个小项目,作为Java测试课程的实习,我们试图看看mocking是如何工作的。 我们的目标是看到我们可以忽略我们所嘲笑的类中的错误。 正如您在Collaborateur中看到的,缺少一个“;”在System.Out之后,exercice的目标是表明嘲笑这个类可以让我们忽略这个错误。我的一些同事使用Eclipse时,使用“以JUnit形式运行”功能没有问题。 在Intellij中,我没

  • Mockito注释或不能用于接口: 解决方案2: 我的问题是,使用解决方案2并让Mockito处理实例化(但这意味着声明一个实现而不是一个接口),还是使用带有接口的解决方案1并自己声明一个实现,这是一个好主意。

  • 我有一个父组件,它有许多子组件(子组件是一个带有彩色背景的空div)。 我想改变孩子的颜色,但要确保我正在使它变成一个不同的颜色比它已经是-例如,如果孩子是蓝色的,我想改变它到另一个颜色,不是蓝色。 为此,我使用一个道具来设置初始颜色,并将此道具保存到孩子的状态。 当我点击div更改颜色时,我想访问div的当前颜色,以便我可以将其从选择中排除,当然可以从中进行选择 1)这被认为是可以做的反应吗?2