在单元测试中,伪造和存根用于创建测试隔离:伪造:模拟被测单元,控制行为并验证交互,用于替换外部或难以测试的依赖项。存根:特殊伪造,模拟函数或方法,始终返回固定值或执行指定动作,用于替换耗时或不稳定的依赖项。
C++ 单元测试中的伪造与存根的使用场景
在单元测试中,伪造和存根是创建测试隔离环境的两种强大技术。它们允许测试开发者在不依赖其他组件的情况下测试特定代码。
伪造(Mock)
立即学习“C++免费学习笔记(深入)”;
伪造是为被测单元创建一个模拟版本,它可以控制其行为并验证其交互。伪造通常用于替换外部或难以测试的依赖项。
例如:
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++ 单元测试中伪造与存根的使用场景?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2575443.html