我通过Google Mock: Return() a list of values阅读并了解了如何从每个EXPECT_CALL上的向量返回单个元素,因此我编写了以下代码:
{
testing::InSequence s1;
for (auto anElem:myVecCollection) {
EXPECT_CALL(myMockInstance, execute())
.WillOnce(testing::Return(anElem));
}
}
到目前为止一直很好...... 现在我读到除非你需要,否则不要使用EXPECT_CALL。 https://groups.google.com/forum/#!topic/googlemock/pRyZwyWmrRE 我的用例myMockInstance实际上是一个为SUT(被测软件)提供数据的存根。
然而,一个简单的EXPECT_CALL到ON_CALL替换将不起作用(??),因为带有WillByDefault的ON_CALL只计算一次返回类型(??)
因此我尝试设置一个ACTION。
ACTION_P(IncrementAndReturnPointee, p)
{
return (p)++;
}
ON_CALL(myMockInstance, execute())
.WillByDefault(testing::Return
(*(IncrementAndReturnPointee(myVecCollection.cbegin()))));
Clang给出
error: expected expression 'ACTION_P(IncrementAndReturnPointee, p)'
然后我尝试设置一个仿函数并在其上使用Invoke方法。
struct Funct
{
Funct() : i(0){}
myClass mockFunc(std::vector<myClass> &aVecOfMyclass)
{
return aVecOfMyclass[i++];
}
int i;
};
Funct functor;
ON_CALL(myMockInstance, execute())
.WillByDefault(testing::Return(testing::Invoke(&functor, functor.mockFunc(myVecCollection))));
Clang给出
no matching function for call to 'ImplicitCast_'
: value_(::testing::internal::ImplicitCast_<Result>(value)) {}
现在,我对google-mock相当新,但广泛使用了google-test。 我对Google-Mock doc感到有些迷茫。根据我的需要,我想知道我是否走在正确的道路上。 如果你们中的一个人能指出我,哪种方法是正确的;或者我是否接近正确的方法,我可以从那里采取它并进一步调试“接近正确的方法”。 感谢
答案 0 :(得分:1)
testing::Return
是一项行动。您的代码应如下所示:
ACTION_P(IncrementAndReturnPointee, p)
{
return *(p++);
}
ON_CALL(myMockInstance, execute())
.WillByDefault(IncrementAndReturnPointee(myVecCollection.cbegin()));
作为旁注,使用有限集合myVecCollection
似乎不是一个好主意。如果你找到一个动作的实现来创建一个可以动态返回的新元素,你可能会得到一个更强大的测试。