【问题标题】:googlemock giving error while building a program with mockgooglemock 在使用 mock 构建程序时出错
【发布时间】:2021-06-15 11:38:44
【问题描述】:

我有一些 C 和 C++ 方面的经验。但我是 googletest 和 googlemock 的新手。 我正在尝试对 C++ 程序进行单元测试。 我在使用 googletest 时没有收到任何错误。但是,当我开始使用 googlemock 时,我遇到了问题。 我有一个使用 googlemock 的简单代码,当我尝试使用命令构建它时

g++ mock.cpp -lgtest -lgtest_main -lgmock -pthread

我收到了这个我无法理解的错误。 (我已经附上了程序和我得到的错误)。

请帮助我理解并克服它。 提前致谢。

模拟.cpp

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

using namespace std;
using ::testing::AtLeast;
using ::testing::Return;
using ::testing::_;


class DataBaseConnect{
    public:
        virtual bool login(string username, string password){ return true; }
        virtual bool logout(string username){ return true; }
        virtual int fetchRecord(){ return -1; }
};


class MockDB : public DataBaseConnect{
    public:
        MOCK_METHOD0(fetchRecord, int());
        MOCK_METHOD1(logout, bool(string username));
        MOCK_METHOD2(login, bool(string username, string password));
};


class MyDatabase{
    DataBaseConnect & dbC;
    public:
        MyDatabase(DataBaseConnect & _dbC) : dbC(_dbC) {}

        int Init(string username, string password){
            if(dbC.login(username, password) != true){
                cout<<"DB FAILURE\n";
                return -1;
            }
            else{
                cout<<"DB SUCCESS\n";
                return 1;
            }
        }
};


TEST(MyDBTest, LoginTest){
    //Arrange
    MockDB mdb;
    MyDatabase db(mdb);

    EXPECT_CALL(mdb, login(_, _))
    .Times(1)
    .WillOnce(Return(true));

    //Act
    int retVal = db.Init("Terminator", "I'm Back");

    //Assert
    EXPECT_EQ(retVal, 1);
}


int main(int argc, char **argv){
    testing::InitGoogleTest(&argc, argv);

    return RUN_ALL_TESTS();
}

命令:

g++ mock.cpp -lgtest -lgmock -lgtest_main -pthread

错误:

g++ mock.cpp -lgtest -lgmock -lgtest_main -pthread
/usr/bin/ld: /tmp/ccFl5wbu.o: in function `testing::internal::linked_ptr_internal::join(testing::internal::linked_ptr_internal const*)':
mock.cpp:(.text._ZN7testing8internal19linked_ptr_internal4joinEPKS1_[_ZN7testing8internal19linked_ptr_internal4joinEPKS1_]+0x2a): undefined reference to `testing::internal::g_linked_ptr_mutex'
/usr/bin/ld: /tmp/ccFl5wbu.o: in function `testing::internal::linked_ptr_internal::depart()':
mock.cpp:(.text._ZN7testing8internal19linked_ptr_internal6departEv[_ZN7testing8internal19linked_ptr_internal6departEv]+0x27): undefined reference to `testing::internal::g_linked_ptr_mutex'
/usr/bin/ld: /tmp/ccFl5wbu.o: in function `testing::internal::FunctionMockerBase<int ()>::InvokeWith(std::tuple<> const&)':
mock.cpp:(.text._ZN7testing8internal18FunctionMockerBaseIFivEE10InvokeWithERKSt5tupleIJEE[_ZN7testing8internal18FunctionMockerBaseIFivEE10InvokeWithERKSt5tupleIJEE]+0x33): undefined reference to `testing::internal::UntypedFunctionMockerBase::UntypedInvokeWith(void const*)'
/usr/bin/ld: /tmp/ccFl5wbu.o: in function `testing::internal::FunctionMockerBase<bool (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)>::InvokeWith(std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)':
mock.cpp:(.text._ZN7testing8internal18FunctionMockerBaseIFbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE10InvokeWithERKSt5tupleIJS7_EE[_ZN7testing8internal18FunctionMockerBaseIFbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE10InvokeWithERKSt5tupleIJS7_EE]+0x33): undefined reference to `testing::internal::UntypedFunctionMockerBase::UntypedInvokeWith(void const*)'
/usr/bin/ld: /tmp/ccFl5wbu.o: in function `testing::internal::FunctionMockerBase<bool (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)>::InvokeWith(std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)':
mock.cpp:(.text._ZN7testing8internal18FunctionMockerBaseIFbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EE10InvokeWithERKSt5tupleIJS7_S7_EE[_ZN7testing8internal18FunctionMockerBaseIFbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EE10InvokeWithERKSt5tupleIJS7_S7_EE]+0x33): undefined reference to `testing::internal::UntypedFunctionMockerBase::UntypedInvokeWith(void const*)'
/usr/bin/ld: /tmp/ccFl5wbu.o: in function `testing::internal::FunctionMockerBase<bool (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)>::AddNewExpectation(char const*, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::tuple<testing::Matcher<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, testing::Matcher<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)':
mock.cpp:(.text._ZN7testing8internal18FunctionMockerBaseIFbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EE17AddNewExpectationEPKciRKS7_RKSt5tupleIJNS_7MatcherIS7_EESG_EE[_ZN7testing8internal18FunctionMockerBaseIFbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EE17AddNewExpectationEPKciRKS7_RKSt5tupleIJNS_7MatcherIS7_EESG_EE]+0xda): undefined reference to `testing::Expectation::Expectation(testing::internal::linked_ptr<testing::internal::ExpectationBase> const&)'
collect2: error: ld returned 1 exit status

【问题讨论】:

  • 可能是因为您链接gtest 之前使用它的部分库? stackoverflow.com/a/409402/1171191
  • 你没有链接gmock_main
  • 试试这个g++ mock.cpp -lgmock -lgtest -lgtest_main -pthread
  • 你好@prehistoricpenguin,我试过你提到的命令。但是后来,我收到了大量的错误,包括“无法转换”、“无效初始化”等等。有超过 100 个错误。
  • 感谢@BoBTFish 的回复。现在,我知道为什么我们应该注意链接库的顺序了。

标签: c++ unit-testing googletest googlemock


【解决方案1】:

好像你的教程忘记安装gmock.so,所以编译完成后,你需要输入sudo make install来安装所有的库文件。

而且你使用的gtest版本已经过期,建议使用这个版本:

https://github.com/google/googletest/archive/refs/tags/release-1.11.0.tar.gz

Other answers你的教程周围也指出,我们需要安装gmock库。那么问题应该就解决了。

【讨论】:

  • 谢谢。现在,代码编译并运行,没有任何错误。从现在开始,我会牢记所面临的问题。
猜你喜欢
  • 1970-01-01
  • 2012-04-22
  • 2012-05-18
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多