C++ 单元测试中伪造与存根的使用场景?

在单元测试中,伪造和存根用于创建测试隔离:伪造:模拟被测单元,控制行为并验证交互,用于替换外部或难以测试的依赖项。存根:特殊伪造,模拟函数或方法,始终返回固定值或执行指定动作,用于替换耗时或不稳定的依赖项。

C++ 单元测试中伪造与存根的使用场景?

C++ 单元测试中的伪造与存根的使用场景

在单元测试中,伪造和存根是创建测试隔离环境的两种强大技术。它们允许测试开发者在不依赖其他组件的情况下测试特定代码。

伪造(Mock)

伪造是为被测单元创建一个模拟版本,它可以控制其行为并验证其交互。伪造通常用于替换外部或难以测试的依赖项。

例如:

class UserService {
public:
  virtual User GetUser(int id) = 0;
};

class UserServiceMock : public UserService {
public:
  MOCK_METHOD(User, GetUser, (int id), (override));
};
登录后复制

在此示例中,UserServiceMockUserService 的伪造,用于控制 GetUser() 方法的行为,以便可以在测试中对其进行验证。

存根(Stub)

存根是一种特殊的伪造,它模拟一个函数或方法,总是返回一个固定的值或执行指定的动作。存根通常用于替换耗时或不稳定的依赖项。

例如:

// SleepStub 不实际调用 sleep 函数,而是返回一个固定的值
class SleepStub {
public:
  static void Sleep(int) {}
};
登录后复制

使用案例

伪造和存根在单元测试中有多个使用案例,包括:

  • 测试与外部依赖项的交互。
  • 隔离难以或耗时的操作。
  • 验证参数传递和函数调用顺序。
  • 测试错误处理和异常情况。

实战案例

假设我们有一个函数,它从 UserService 获取用户并在数据库中更新用户的密码:

void UpdateUserPassword(int userId, const std::string& newPassword) {
  auto user = userService.GetUser(userId);
  user.SetPassword(newPassword);
  db.UpdateUser(user);
}
登录后复制

我们可以创建一个单元测试用例,使用 UserServiceMock 伪造 UserService 并验证函数的正确行为:

TEST(UpdateUserPassword, UpdatesPassword) {
  UserServiceMock userServiceMock;
  User expectedUser;
  EXPECT_CALL(userServiceMock, GetUser(userId)).WillOnce(Return(expectedUser));
  UpdateUserPassword(userId, newPassword);
  // Assert that the user password was set correctly
  ASSERT_EQ(expectedUser.GetPassword(), newPassword);
}
登录后复制

在这个测试用例中,我们确保 GetUser() 被调用了一次,并且返回了预期用户。然后,我们断言用户密码已正确更新。

以上就是C++ 单元测试中伪造与存根的使用场景?的详细内容,更多请关注小编网其它相关文章!

转载请说明出处 内容投诉内容投诉
南趣百科 » C++ 单元测试中伪造与存根的使用场景?

南趣百科分享生活经验知识,是您实用的生活科普指南。

查看演示 官网购买