在单元测试中,伪造和存根用于创建测试隔离:伪造:模拟被测单元,控制行为并验证交互,用于替换外部或难以测试的依赖项。存根:特殊伪造,模拟函数或方法,始终返回固定值或执行指定动作,用于替换耗时或不稳定的依赖项。
C++ 单元测试中的伪造与存根的使用场景
在单元测试中,伪造和存根是创建测试隔离环境的两种强大技术。它们允许测试开发者在不依赖其他组件的情况下测试特定代码。
伪造(Mock)
伪造是为被测单元创建一个模拟版本,它可以控制其行为并验证其交互。伪造通常用于替换外部或难以测试的依赖项。
例如:
class UserService { public: virtual User GetUser(int id) = 0; }; class UserServiceMock : public UserService { public: MOCK_METHOD(User, GetUser, (int id), (override)); };
登录后复制
在此示例中,UserServiceMock
是 UserService
的伪造,用于控制 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++ 单元测试中伪造与存根的使用场景?的详细内容,更多请关注叮当号网其它相关文章!
文章来自互联网,只做分享使用。发布者:走不完的路,转转请注明出处:https://www.dingdanghao.com/article/390783.html