gmock与链接错误 当我尝试用我的C++代码类和模拟对象编译我的单元测试时,我得到了链接错误。我正在使用makefile和clangcompiler(osx命令行)

gmock与链接错误 当我尝试用我的C++代码类和模拟对象编译我的单元测试时,我得到了链接错误。我正在使用makefile和clangcompiler(osx命令行),c++,unit-testing,makefile,gmock,C++,Unit Testing,Makefile,Gmock,下面是一个简化的例子。谢谢你能帮我解决这个问题。 文件夹结构如下: Productioncode->单元测试代码->Gmock和GTest文件夹 1) 将进行单元测试的生产代码类别A myclass_a.h: #ifndef MYCLASS_A_H #define MYCLASS_A_H #include "myclass_b.h" class MyClass_A { public: MyClass_A(); virtual void DoBThing(); private

下面是一个简化的例子。谢谢你能帮我解决这个问题。 文件夹结构如下:

Productioncode->单元测试代码->Gmock和GTest文件夹

1) 将进行单元测试的生产代码类别A

myclass_a.h:

#ifndef MYCLASS_A_H
#define MYCLASS_A_H

#include "myclass_b.h"

class MyClass_A
{
public:
    MyClass_A();
    virtual void DoBThing();

private:
    MyClass_B secondClass;
};

#endif // MYCLASS_A_H
myclass_a.cpp:

#include "myclass_a.h"

MyClass_A::MyClass_A()
{
}

void MyClass_A::DoBThing()
{
    secondClass.DoThis();
}
2) 生产代码类B。模拟对象将派生它

myclass_b.h:

#ifndef MYCLASS_B_H
#define MYCLASS_B_H

class MyClass_B
{
public:
    MyClass_B();
    virtual void DoThis();
};

#endif // MYCLASS_B_H
myclass_b.cpp:

#include "myclass_b.h"

MyClass_B::MyClass_B()
{
}

void MyClass_B::DoThis()
{
}
3) 单元测试代码

MyClassA_UT.cpp:

#include "Mock-MyClassB.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "../myclass_a.h"

TEST(ClassACategory,Test1)
{
    MockMyClass_B classB;
    EXPECT_CALL(classB, DoThis());
    MyClass_A classA;

    classA.DoBThing();
}
4) 模拟对象

Mock MyClassB.h:

#include "gmock/gmock.h"  // Brings in Google Mock.
#include "../myclass_b.h"

class MockMyClass_B : public MyClass_B {
 public:
  MOCK_METHOD0(DoThis, void());
};
5) 项目的Makefile(基本文件从google页面复制):

6) 链接错误:

ar rv gmock_main.a gmock-all.o gtest-all.o gmock_main.o
ar: creating archive gmock_main.a
a - gmock-all.o
a - gtest-all.o
a - gmock_main.o
c++ -isystem ./gtest-1.7.0/include -isystem ./gmock-1.7.0/include -g -Wall -Wextra -pthread -lpthread MyClassA_UT.o myclass_a.o gmock_main.a -o UnitTest
clang: warning: argument unused during compilation: '-pthread'
Undefined symbols for architecture x86_64:
  "MyClass_B::DoThis()", referenced from:
      MyClass_A::DoBThing() in myclass_a.o
  "MyClass_B::MyClass_B()", referenced from:
      MyClass_A::MyClass_A() in myclass_a.o
  "MyClass_B::MyClass_B()", referenced from:
      MockMyClass_B::MockMyClass_B() in MyClassA_UT.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [UnitTest] Error 1
如果我将类B对象添加到makefile,那么将调用类B的方法而不是mock方法

编辑,如果我添加类B,编译通过但测试用例失败:

./UnitTest
Running main() from gmock_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from ClassACategory
[ RUN      ] ClassACategory.Test1
.//MyClassA_UT.cpp:9: Failure
Actual function call count doesn't match EXPECT_CALL(classB, DoThis())...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] ClassACategory.Test1 (0 ms)
[----------] 1 test from ClassACategory (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] ClassACategory.Test1

myclass_b.o不是作为链接器参数添加的,这是您的问题。是否正在编译myclass_b.cpp?没有添加myclass_b.cpp,因为我没有测试它。应该使用该mock类,并且应该调用该mock方法。我进行了测试,调用了b类方法,单元测试失败。我有什么误解吗?您的模拟继承自
MyClass\u B
,它声明了虚拟函数
MyClass\u B::DoThis
。这意味着你要么定义它,要么声明它是纯的。您还隐式调用了默认构造函数,因此必须对其进行定义。最好是定义一个接口,然后对其进行模拟以进行测试或对其进行生产实现。但我已经添加了mock:mock_METHOD0(DoThis,void());
./UnitTest
Running main() from gmock_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from ClassACategory
[ RUN      ] ClassACategory.Test1
.//MyClassA_UT.cpp:9: Failure
Actual function call count doesn't match EXPECT_CALL(classB, DoThis())...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] ClassACategory.Test1 (0 ms)
[----------] 1 test from ClassACategory (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] ClassACategory.Test1