C++ 面试题 目录

C++ 中什么是桩 (stub) 和模拟 (mock)?

推荐答案

在C++中,**桩(Stub)模拟(Mock)**是两种用于单元测试的技术,用于模拟依赖对象的行为。

  • 桩(Stub):桩是一个简单的实现,通常用于替换测试中的依赖对象。它提供预定义的响应,以便测试代码可以在不依赖实际外部系统的情况下运行。桩通常用于模拟外部依赖的简单行为,例如返回固定的值或抛出异常。

  • 模拟(Mock):模拟对象不仅提供预定义的响应,还可以记录测试过程中与它的交互。模拟对象通常用于验证测试代码是否按预期调用了某些方法或函数。模拟对象可以检查方法调用的次数、参数等,并确保测试代码的行为符合预期。

本题详细解读

桩(Stub)

桩是一种简单的测试替身,通常用于替换测试中的依赖对象。它的主要目的是提供预定义的响应,以便测试代码可以在不依赖实际外部系统的情况下运行。桩通常用于模拟外部依赖的简单行为,例如返回固定的值或抛出异常。

例如,假设你有一个依赖于数据库的类,你可以在测试中使用一个桩来模拟数据库的行为,而不是实际连接到数据库。这样可以确保测试的独立性和可重复性。

在这个例子中,DatabaseStub 是一个桩,它模拟了数据库的 query 方法,并返回一个固定的值 42

模拟(Mock)

模拟对象不仅提供预定义的响应,还可以记录测试过程中与它的交互。模拟对象通常用于验证测试代码是否按预期调用了某些方法或函数。模拟对象可以检查方法调用的次数、参数等,并确保测试代码的行为符合预期。

例如,假设你有一个依赖于日志系统的类,你可以在测试中使用一个模拟对象来验证日志系统是否被正确调用。

-- -------------------- ---- -------
----- ---------- - ------ ------ -
-------
    ----------------- ---- ------ ------------ --------- ------------
--

----------------- -------------- -
    ---------- -------
    ------- ----------------

    ------------------- --------- -----------

    ----------------------
-

在这个例子中,LoggerMock 是一个模拟对象,它使用 Google Mock 框架来验证 log 方法是否被正确调用。EXPECT_CALL 宏用于设置期望,确保 log 方法被调用时传入的参数是 "Test message"

总结

  • 桩(Stub):用于提供预定义的响应,通常用于模拟外部依赖的简单行为。
  • 模拟(Mock):用于验证测试代码是否按预期调用了某些方法或函数,并记录交互过程。

通过使用桩和模拟,可以有效地隔离测试代码与外部依赖,确保测试的独立性和可重复性。

纠错
反馈