【问题标题】:When passing gmock object as reference the setup expectations doesnt match [duplicate]当传递 gmock 对象作为参考时,设置期望不匹配 [重复]
【发布时间】:2021-04-29 19:55:31
【问题描述】:

我想测试下一个类的行为。

class DAO{
    otl_connect *conn;
    public:
        DAO(otl_connect* _conn){
            conn = _conn;
        }

        bool init(){
            bool ret = true;
            try{
                conn->rlogon("ABC");
            }catch(otl_exception &e){
                ret = false;
            }
            return ret;
        }
};

为此,我从 otl_connect 创建了一个派生的模拟类;

class MockOtlConnect : public otl_connect {
    public:
        MOCK_METHOD0(logoff, void());
        MOCK_METHOD1(rlogon, void(const char *connect_str));
};

在我的测试中,它创建了对函数调用rlogon的期望

TEST(TesteMockOtlConnect, MockingOtlConnect){
    MockOtlConnect mock;
    EXPECT_CALL(mock, rlogon("ABC"));

    DAO dao(&mock);
    EXPECT_TRUE(dao.init();
}

但这种期望永远不会得到满足。

Actual function call count doesn't match EXPECT_CALL(mock, rlogon("ABC"))...
         Expected: to be called once
           Actual: never called - unsatisfied and active

【问题讨论】:

  • 被模拟的方法必须是virtual,在this documentation中没有任何东西表明它们是virtual。要么使用虚拟方法将其全部包装在您自己的包装类中,要么阅读有关在 GoogleMock cookbook 中模拟非虚拟方法的章节

标签: c++ unit-testing googletest gmock otl


【解决方案1】:

问题是匹配器错误。通过写作:

EXPECT_CALL(mock, rlogon("ABC"));

您不期望使用字符串"ABC" 调用rlogon,但您期望使用您无法控制的某个指针值进行调用。 原因是你的参数类型是const char *

要修复它,请使用 StrEq() 匹配器。

EXPECT_CALL(mock, rlogon(StrEq("ABC")));

【讨论】:

  • 我猜这两个问题都可能存在,当调用非虚拟函数和无法匹配参数时会打印相同的输出(尽管后者还提供了尝试过的期望的信息)。 godbolt.org/z/c1f78G8re
猜你喜欢
  • 2013-05-28
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多