【问题标题】:Gmock with struct data使用结构数据进行 Gmock
【发布时间】:2017-11-09 13:44:50
【问题描述】:

我想用 gmock 验证函数参数。函数参数的struct格式如下:

SomeClass.h:

class SomeClass {
public:
    SomeClass();
    virtual ~SomeClass();
    struct SomeData {
        int Value;
        int Serie;
    };
    virtual void getData(SomeData &data);
};

SomeClass.cpp:

#include "../include/SomeClass.h"

    SomeClass::SomeClass(){}
    SomeClass::~SomeClass(){}

    void SomeClass::getData(SomeData &data){
        data.Serie = 4;
        data.Value = 5;
    }

MockSomeClass.h

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "../include/SomeClass.h"

class MockSomeClass: public SomeClass {
public:
    MockSomeClass(){};
    virtual ~MockSomeClass(){};
    SomeData data;
    MOCK_METHOD1(getData, void(SomeData &data));
};

testSomeClass:

#include <gtest/gtest.h>
#include <gmock/gmock.h>

#include "../include/SomeClass.h"
#include "MockSomeClass.h"

using ::testing::_;
using ::testing::AtLeast;

TEST(testSomeMethod, test1){
    MockSomeClass mock1;
    SomeClass::SomeData data;
    EXPECT_CALL(mock1, getData(_)).Times(AtLeast(2));
    mock1.getData(data);
    mock1.getData(data);
}

TEST(testSomeMethod, test2){
    MockSomeClass mock2;
    SomeClass::SomeData data;
    EXPECT_CALL(mock2, getData(SomeClass::SomeData &data));
    mock2.getData(data);
}

当我运行 testSomeClass 时,test1 没有错误,但 test2 却造成了问题。有什么建议如何将 struct 格式的数据包含在 gmock 的函数调用中?

【问题讨论】:

  • test2 is causing trouble 是什么意思?
  • 这是错误信息:/testSomeClass.cpp:28:49: error: expected primary-expression before ‘&’ token EXPECT_CALL(mock2, getData(SomeClass::SomeData &data)); ^ /build/test/gtest/src/gtest/googlemock/include/gmock/gmock-spec-builders.h:1846:20:注意:在宏“GMOCK_EXPECT_CALL_IMPL_”((obj).gmock_##call)的定义中。 InternalExpectedAt(FILE, LINE, #obj, #call) ^ /SomeClass/test/testSomeClass.cpp:28:2: 注意:在宏 'EXPECT_CALL' EXPECT_CALL 的扩展中(mock2, getData(SomeClass::SomeData &data)
  • 我正在尝试用 MATCHER 解决这个问题,但到目前为止我还没有成功。一个简单的例子会很棒。
  • 我把 data.Serie 和 data.Value 放在了错误的地方(我只是想验证 getData 函数正在接收具有某些值的参数。)使用这个 MATCHER 它似乎可以工作: MATCHER(data1AreEqual, ""){ return arg.Value >= 5 && arg.Serie

标签: c++ struct gmock googlemock


【解决方案1】:

写googlemock期望时:


EXPECT_CALL(someMock, someMethod(arg1, arg2, arg3, ...))...;

唯一允许的参数 (arg1, arg2, arg3) 是匹配器 - ::testing::Matcher&lt;T1&gt; - 其中T1 是一些方法参数类型。幸运的是,Matcher&lt;T1&gt; 值可以从 T1 值构造。

所以 - 这不可能使用 SomeClass::SomeData &amp;data - 因为这是一些参数声明 - 不是匹配器值。

你可能想使用::testing::Ref matcher - 比如:

EXPECT_CALL(mock2, getData(Ref(data)));

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2011-06-11
    • 1970-01-01
    • 2010-12-22
    • 2011-06-26
    相关资源
    最近更新 更多