Google Mock使用ON_CALL返回实时元素

时间:2015-12-16 22:05:41

标签: c++ unit-testing googlemock

我通过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感到有些迷茫。根据我的需要,我想知道我是否走在正确的道路上。 如果你们中的一个人能指出我,哪种方法是正确的;或者我是否接近正确的方法,我可以从那里采取它并进一步调试“接近正确的方法”。 感谢

1 个答案:

答案 0 :(得分:1)

testing::Return是一项行动。您的代码应如下所示:

ACTION_P(IncrementAndReturnPointee, p)
{
    return *(p++);
}

ON_CALL(myMockInstance, execute())
     .WillByDefault(IncrementAndReturnPointee(myVecCollection.cbegin()));

作为旁注,使用有限集合myVecCollection似乎不是一个好主意。如果你找到一个动作的实现来创建一个可以动态返回的新元素,你可能会得到一个更强大的测试。