【问题标题】:cannot mock CDatabase Open/OpenEx using google mock c++无法使用 google mock c++ 模拟 CDatabase Open/OpenEx
【发布时间】:2015-10-27 11:13:27
【问题描述】:

我正在尝试模拟 Cdatabase 方法“打开”。下面是我做模拟类配置的文件。

afxdb.h

...
    virtual BOOL Open(LPCTSTR lpszDSN, BOOL bExclusive = FALSE,
            BOOL bReadonly = FALSE, LPCTSTR lpszConnect = _T("ODBC;"),
            BOOL bUseCursorLib = TRUE);
...

mock_myCDatabase.h

...<linkers>

class mock_my_CDatabase :public CDatabase
{
public:
    mock_my_CDatabase()
    {}
    ~mock_my_CDatabase()
    {}
    MOCK_METHOD5(Open, BOOL(LPCTSTR lpszDSN, BOOL bExclusive,BOOL bReadonly, LPCTSTR lpszConnect,BOOL bUseCursorLib));
};

DemoClassB.cpp

    ...<linkers>
  ...
    CDemoClassB::CDemoClassB(CDatabase  &p_db)
    {
        m_db = &p_db;
    }
  ...
  ...
    BOOL CDemoClassB::fun2()
    {
        m_db->Open((LPCTSTR)NULL, FALSE, FALSE, (LPCTSTR)"ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb, *.accdb)};DSN='';DBQ=C:\\Karthik\\GMockDemo\\GMockDemo\\RepolyticsDB.accdb", CDatabase::noOdbcDialog);
            return TRUE;
    }

GMockDemo.cpp

// GMockDemo.cpp : Defines the entry point for the console application.
//

...<linkers>

using namespace testing;
using ::testing::Return;


TEST(mock, mockCDatabase)
{
    mock_my_CDatabase mockDb;

    EXPECT_CALL(mockDb, Open((LPCTSTR)"ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb, *.accdb)};DSN='';DBQ=C:\\Karthik\\GMockDemo\\GMockDemo\\RepolyticsDB.accdb", CDatabase::noOdbcDialog)).Times(8).WillRepeatedly(Return(TRUE));
    CDemoClassB m_Bt(mockDb);
    ASSERT_EQ(m_Bt.fun2(), TRUE);
}
...
...
int _tmain(int argc, _TCHAR* argv[])
{
    ::testing::InitGoogleMock(&argc, argv);
    RUN_ALL_TESTS();
    std::getchar(); // keep console window open until Return keystroke
    return 0;
}

我无法模拟 CDatabase 方法: Open 。当我运行代码时,我得到了

预期:被调用一次 实际:从未调用 - 不满意且活跃

谁能帮我模拟一个 CDatabase 方法

【问题讨论】:

  • 我无法找出哪里出错了。抱歉,代码太长了。我是 C++ 和 google mock 的新手。感谢您的宝贵时间。

标签: c++ unit-testing mfc googlemock


【解决方案1】:

您应该在mock_my_CDatabase::Open 上收到uninteresting function calls 的警告消息。检查测试输出。

尝试将string matcher 用于模拟函数参数。您正在尝试将第一个参数与指向文字的指针进行匹配,该指针永远不会匹配。

【讨论】:

  • 我解决了这个问题。你的第二点是我面临的问题的主要原因。我使用过“testing::_”EXPECT_CALL(mock_Db, OpenEx(_, CDatabase::noOdbcDialog)).Times(1).WillOnce(Return(TRUE));感谢它的工作。
  • @mwKART:很高兴为您提供帮助。请编辑您的问题并修改Open/OpenEx 错误。这不是论坛,您实际上可以在发布后编辑问题(和答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多