无法使用Google Mock模拟CDatabase Open函数

时间:2019-10-23 15:52:05

标签: c++ googletest googlemock

我正在尝试使用Google Mock模拟作为CDatabase类的一部分存在的Open函数。 Visual Studio版本:2010年 下面是代码片段:

class TestRLanguage: public RLanguage, public ::testing::Test
{
};

class FakeDatabase : public CDatabase
{
public:
    MOCK_METHOD5(Open_impl, BOOL(LPCTSTR lpszDSN, BOOL bExclusive,BOOL bReadonly, LPCTSTR lpszConnect,BOOL bUseCursorLib));

    BOOL Open(LPCTSTR lpszDSN, BOOL bExclusive = FALSE,
        BOOL bReadonly = FALSE, LPCTSTR lpszConnect = _T("ODBC;"),
        BOOL bUseCursorLib = TRUE) override
    {
        Open_impl( lpszDSN, bExclusive, bReadonly, lpszConnect, bUseCursorLib);
    }
};

// Test case for testing initialize function
TEST_F(TestRLanguage, initializeSuccess)
{
    FakeDatabase database;
    EXPECT_CALL(database, Open(NULL, FALSE, FALSE, "ODBC;DSN=", FALSE)).Times(testing::Exactly(1));
}

我收到以下错误:

error C2770: invalid explicit template argument(s) for 'AddReference<const ::std::tr1::tuple_element<I,std::tr1::tuple<_Arg0,_Arg1,_Arg2,_Arg3,_Arg4>>::type>::type testing::internal::TuplePolicy<TupleT>::get(const std::tr1::tuple<_Arg0,_Arg1,_Arg2,_Arg3,_Arg4> &)'    c:\src\googlemockandtest\aqtsw\util\googletest\googletest-release-1.8.1\googletest\include\gtest\gtest-printers.h

有人可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您的测试中有两个错误:

  1. 您在EXPECT_CALL中放了一个方法函数,它不是模拟方法
  2. 您在测试中未调用任何方法。

这是正确的方法:

TEST_F(TestRLanguage, initializeSuccess)
{

    FakeDatabase database;
    EXPECT_CALL(database, Open_impl(NULL, FALSE, FALSE, "ODBC;DSN=", FALSE)).Times(testing::Exactly(1));
    database.Open(NULL);
}

答案 1 :(得分:0)

我遇到了同样的问题。就我而言,它与 Google Test 的版本有关。我遇到了版本 1.8.1 的问题——“支持 C++11 之前的编译器的最后一个版本”(如 here 所述)。此问题已通过 pull request #1817 解决。我现在使用 branch 1.8.x 的 HEAD (commit dea0216) 并且问题消失了。