在集成测试中模拟是否被认为是一种好习惯?

2 java spring mocking mockito

有人告诉我,@ Mock通常仅用于单元测试,但我认为将其替换为测试类之外的外部部件很有用。在集成测试中模拟是否正确?

Gho*_*ica 7

最后,这全部与措辞有关。

当您从基本意义上说“正确”时,例如正确性,答案就是:不。

您会看到,集成测试的目标是确保集成系统(由多个不同组件组成)能够按预期运行。集成测试的目的是验证组件的“连接”是否按预期工作。因此:你无法验证,当你的系统的工作原理部分该系统被嘲笑了。

但是,您可以不太严格地考虑“正确性”。

示例:销售汽车的公司必须测试ECU。基本上是一块硬件,运行着可能庞大的软件堆栈。这些ECU通常在汽车内运行。因此,当您要对ECU进行集成测试时,必须将ECU放入汽车中进行测试,对吗?可能还不存在的汽车。这里的解决方案:有硬件仿真器。您将ECU插入该仿真器中,然后ECU就“思考”在真实汽车内。

因此:有很好的论据声称“真正的集成测试不能使用模拟”,但与此同时,在现实世界中,这种“模拟”一直在发生。

因此,真正的答案是:它取决于上下文。因此,没有一个普遍的答案。相反,这是关于沟通的。您“仅”必须确保您的组/组织中的所有人对这些术语都具有相同的理解。

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


mio*_*mio 5

是的,您可以@Mock在集成测试中使用(主要用于存根)的场景。特别是如果您想对类的一部分进行集成测试。

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

另一个示例,如果您测试工作流,则通过模拟单个步骤/活动来测试路径的集成测试是有意义的。

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


dav*_*xxx 5

\n

在集成测试中模拟是否正确?

\n
\n\n

一般情况:您不在集成测试中进行模拟

\n\n

一般来说,模拟测试和集成测试并不适合在一起。
\n大多数时候,您想使用其中之一或使用第二个,而不是同时使用两者。

\n\n

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

\n\n

如果您依赖一个为您执行许多操作的框架或库,并且您需要测试在此框架中指定的逻辑,那么您将通过编写比单元测试更多的集成测试来完成,因为单元测试通常根本不足以覆盖应用程序代码。
\n但是完整的集成测试与其他组件根本没有隔离(因此可能会产生副作用:测试可能会因为不好的原因而成功),这些测试通常很慢,因此通常不会在本地计算机上执行,因为本地计算机为开发商。
\n因此,仅编写完整的集成测试通常是不可接受的。\n对于这种情况,在集成测试期间进行模拟的想法非常有意义。

\n\n

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

\n\n

由 Spring Boot 驱动的应用程序就属于这一类。
\n事实上,我们希望运行容器以便能够测试某些特定部分(持久性、控制器等),但我们不想加载整个容器和关联的组件。
\n因此,嘲笑某些特定部分确实很有意义。
\n和测试切片允许在被测组件在某种集成级别上进行测试时进行模拟:

\n\n
\n

Spring Boot\xe2\x80\x99s 自动配置系统对于应用程序来说运行良好,但有时对于测试来说有点太多了。仅加载测试应用程序的\n \xe2\x80\x9cslice\xe2\x80\x9d 所需的配置部分通常会有所帮助。例如,您可能想要测试\n Spring MVC 控制器是否正确映射 URL,而您不想\n 在这些测试中\n 涉及数据库调用,或者您可能想要测试\n JPA 实体,但您不感兴趣当这些测试运行时在 Web 层\n

\n
\n


小智 -4

有两种类型的测试。单元测试和集成测试。您可以使用 Mock 来执行单元测试。在单元测试中,您测试各个方法,重点是测试各个方法的行为。因此,在单元测试中使用模拟是有意义的。

因为您不能使用模拟来执行集成测试。集成测试通常涉及所有集成的依赖系统,我们在任何服务器/云上执行它。

  • 还有功能测试。以及系统测试。以及功能测试等等...... (2认同)