【问题标题】:Google Mock Return a live element using ON_CALLGoogle Mock 使用 ON_CALL 返回一个活动元素
【发布时间】:2015-12-16 22:05:40
【问题描述】:

我通读了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 文档有点迷茫。我想知道,就我需要的东西而言,我是否走在正确的道路上。 如果你们中的一个人可以指出我,哪种方法是正确的;或者我是否接近正确的方法,我可以从那里开始并进一步调试“接近正确的方法”。 谢谢

【问题讨论】:

    标签: c++ unit-testing googlemock


    【解决方案1】:

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

    ACTION_P(IncrementAndReturnPointee, p)
    {
        return *(p++);
    }
    
    ON_CALL(myMockInstance, execute())
         .WillByDefault(IncrementAndReturnPointee(myVecCollection.cbegin()));
    

    附带说明,使用有限集合myVecCollection 看起来不是一个好主意。如果您找出创建新元素以即时返回的操作的实现,您可能会得到更稳健的测试。

    【讨论】:

    • 谢谢。因为,我正在使用 gmock 创建一个存根,所以我事先已经知道我的 SUT 的输入是什么。但是,由于遗留代码的原因,我不能每次都即时提供元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多