- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
依赖注入(inject)的好处之一是易于测试,因为可以注入(inject)模拟类。为此,Clazz 使用原始指针并将其移动到唯一指针,以表示它拥有 InjectedObj 对象:
Clazz::Clazz(InjectedObj *injectedObj) : injectedObjPtr(injectedObj) { }
injectedObjPtr
是成员(member):
std::unique_ptr<InjectedObj> injectedObjPtr;
//doSth method
int CLazz::doSth() {
return injectedObjPtr->executeSth();
}
TEST_F(testFixture, exeuteTest)
{
//before
InjectedObj* injectedObj = new InjectedObj();
EXPECT_CALL(*injectedObj, executeSth())
.Times(1)
.WillOnce(Return(100));
//when
Clazz clazz(injectedObj);
//then
ASSERT_DOUBLE_EQ(clazz->doSth(), 100);
}
clazz->doSth()
正在拨打
injectedObj->executeSth
它应该返回 100,但它的行为就像我永远不会设置我的期望并且总是得到 0。显然,如果我将在没有智能指针的情况下调用我的模拟对象:
injectedObj->executeSth
它返回 100,但在使用 unique_ptr 调用时不会返回。当模拟对象由智能指针管理时,有没有办法告诉 gmock 设置正确的期望?谢谢
最佳答案
鉴于:
struct InjectedObj {
MOCK_METHOD0(executeSth, int());
};
struct Clazz {
Clazz(InjectedObj* injectedObj)
: injectedObjPtr(injectedObj) {}
int doSth() {
return injectedObjPtr->executeSth();
}
std::unique_ptr<InjectedObj> injectedObjPtr;
};
TEST(testFixture, exeuteTest) {
// before
InjectedObj* injectedObj = new InjectedObj();
EXPECT_CALL(*injectedObj, executeSth()).Times(1).WillOnce(testing::Return(100));
// when
Clazz clazz(injectedObj);
// then
ASSERT_DOUBLE_EQ(clazz.doSth(), 100);
}
我有:
[----------] 1 test from testFixture
[ RUN ] testFixture.exeuteTest
[ OK ] testFixture.exeuteTest (0 ms)
[----------] 1 test from testFixture (0 ms total)
我敢打赌:你忘了标记
executeSth
在
InjectedObj
的基类中
virtual
方法。这样,gmock 生成了
gmock_executeSth
您设置了期望的方法,但在测试中
executeSth
来自基类(没有动态调度)被使用,因此测试失败。
// Example, bad
// THE executeSth METHOD SHALL BE MARKED WITH virtual!!!!!
struct InjectedObj {
virtual ~InjectedObj() = default;
int executeSth() {
return 0;
}
};
struct InjectedObjMock : public InjectedObj {
MOCK_METHOD0(executeSth, int());
};
struct Clazz {
Clazz(InjectedObj* injectedObj)
: injectedObjPtr(injectedObj) {}
int doSth() {
return injectedObjPtr->executeSth();
}
std::unique_ptr<InjectedObj> injectedObjPtr;
};
TEST(testFixture, exeuteTest) {
// before
InjectedObjMock* injectedObj = new InjectedObjMock();
EXPECT_CALL(*injectedObj, executeSth()).Times(1).WillOnce(testing::Return(100));
// when
Clazz clazz(injectedObj);
// then
ASSERT_DOUBLE_EQ(clazz.doSth(), 100);
}
输出:
[ RUN ] testFixture.exeuteTest
/home/dchrzanowski/gitrepos/priv/gtestgmock/so.cpp:41: Failure
Expected: clazz.doSth()
Which is: 0
To be equal to: 100
/home/dchrzanowski/gitrepos/priv/gtestgmock/so.cpp:35: Failure
Actual function call count doesn't match EXPECT_CALL(*injectedObj, executeSth())...
Expected: to be called once
Actual: never called - unsatisfied and active
[ FAILED ] testFixture.exeuteTest (0 ms)
[----------] 1 test from testFixture (0 ms total)
避免这种情况的最佳方法:始终使基类成为纯虚拟 iface。
关于c++11 - 在 unique_ptr 上 GMOCK EXPECT_CALL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51473824/
A 类正在测试中,我希望 EXPECT_CALL 立即返回,并为模拟的 asyncfunc() 方法调用值为 200(右值引用)的 lamda 函数。请阅读符合代码的注释 #include "gtes
我的 mock 定义如下: template class ParseTreeMock : public ParseTreeInterface { public: MOCK_ME
有没有办法在函数的局部对象上使用 EXPECT_CALL? 例如: template std::string doSomethingWithTheCar() { T car; retu
我知道 EXPECT_CALL 应该用于模拟类及其对象/方法。但是有没有可能使用它来期望调用本地方法? void Sample::Init() { // some codes here...
我正在使用 gtest & gmock 并希望对使用集合调用的函数设置期望值。我想确保这个集合包含多个元素。 像这样: EXPECT_CALL(*mView, SetHighlightedCells(
我有一个类通过调用 subscribe(callbackfunction) 来“订阅”来自组件的信号。我现在正尝试通过保存回调并稍后向其发送数据以测试该组件的其他部分来使用 gtest/gmock 测
我有一个类,其中包含几个相互依赖的方法。让我们说 foo()、bar() 和 baz()。 当我测试 bar() 时我需要模拟 foo() 的行为,当我测试 baz() 时我需要模拟 bar() 的行
我有一个用于串行接口(interface)的简单模拟类: class MockSerialPort : public drivers::SerialPort { public: MockS
我有一些期望,比如 EXPECT_CALL (...) EXPECT_CALL(t1, foo()).Times(1); 我想创建相反的。 我期望某个函数不会被执行 . 我应该使用什么方法? 类似 E
我有两个模拟。一次运行只应调用其中一个,我想在不知道给定先决条件的情况下使用期望来确定 execute() 函数是否成功。 如何实现? Mock1 successMock; Mock2 failMoc
#include "gtest\gtest.h" using namespace testing; class MyGTest : public Test { public: void f()
我有一个类,其构造函数调用一个成员函数,该成员函数又调用其他成员函数。我想使用 GMock 创建一个模拟类,并验证在构造模拟类对象时,这些成员函数在构造过程中被调用了一次。但我观察到以下困境: 一方面
我是 Gmock 的新手。我尝试了一个例子,但它是错误的。我也引用了该组的一些帖子,但对我没有帮助。 class MATH { public: virtual ~MATH(){} virt
测试用例应断言调用了资源的方法tagcache(),以确保更新资源的标签缓存。我知道调用了该方法,但测试失败,因为: Expected: to be called at least once Actu
我在 C 中有以下代码想使用谷歌测试框架进行测试: a.h void getValue(int age, int * value); a.c #include void getValue(int a
我刚刚开始使用 GoogleTest 和 GoogleMock。阅读"for dummies" documentation该示例测试依赖于 Turtle 的 Painter 类: 真实对象-Turtl
Google Mock documentation说: Important note: Google Mock requires expectations to be set before the m
我必须遵循模拟函数 DoSomething(const char* par0, const char* par2) DoSomething2(std::string); 我将 DoSomething
struct obj { int a; string str; string str2; bool operator==(const obj& o) const { if
我对 Google Mock 还是很陌生,所以边学边学。我刚刚添加了一些单元测试,但遇到了一个问题,我无法让 ON_CALL() 正确地 stub 从方法内部调用的方法。 下面的代码概述了我所拥有的;
我是一名优秀的程序员,十分优秀!