C++ 如何在GMock中使用带有测试夹具的mock?

C++ 如何在GMock中使用带有测试夹具的mock?,c++,googletest,googlemock,C++,Googletest,Googlemock,我的测试中有一个测试夹具,因此我不必重复实例化类的对象,但我不确定如何使用mock。简单地说,这就是类的定义方式: class Class1 { public: Class1(std::shared_ptr<Class2> class_two); void doThisThing() { doThatThing(); } } class Class2 { public: Class2(Class3* class3_ptr); int doThatThing(); }

我的测试中有一个测试夹具,因此我不必重复实例化类的对象,但我不确定如何使用mock。简单地说,这就是类的定义方式:

class Class1 {
public:
  Class1(std::shared_ptr<Class2> class_two);
  void doThisThing() { doThatThing(); }
}

class Class2 {
public:
  Class2(Class3* class3_ptr);
  int doThatThing();
}
Class1类{
公众:
一级(标准:共享二级);
void doThisThing(){doThatThing();}
}
二级{
公众:
第二类(第三类*第三类);
int doThatThing();
}
(类1使用指向类2的共享指针构造。类2使用指向类3的指针构造。类1调用函数“doThisThing”,该函数调用类2的函数doThatThing。)

我需要为doThatThing()创建一个mock(以及类2的其余函数),但不知道如何将mock对象传递给类1。以下是到目前为止我在测试代码中的内容:

class TestClass1 : public ::testing::Test {
  TestClass1(){
//Construct instance of Class1 and store as member variable
    std::shared_ptr<Class3> class_three = std::make_shared<Class3>();
    std::shared_ptr<Class2> class_two = std::make_shared<Class2>((Class3*)class_three.get());
    class_one = new Class1(class_two);
  };
Class1* class_one;
}

MockClass2 : public Class2 {
  MOCK_METHOD0(doThatThing, int());
}

TEST_F(TestClass1, doThatThingTest){
  MockClass2 mockObj;

**THIS IS WHERE I'M STUCK. How do I get that mockObj into my TestClass1 Fixture? As of now, it is calling the actual function, not the mock***

  class_one->doThatThing();
  EXPECT_CALL(mockObj, doThatThing());
}
类TestClass1:public::testing::Test{
TestClass1(){
//构造Class1的实例并存储为成员变量
std::shared_ptr class_three=std::make_shared();
std::shared_ptr class_two=std::make_shared((Class3*)class_two.get());
一类=新的一类(二类);
};
第一类*第一类;
}
MockClass2:公共类2{
MOCK_方法0(doThatThing,int());
}
测试F(测试类别1,doThatThingTest){
MockClass2 mockObj;
**这就是我被卡住的地方。我如何将mockObj放入我的TestClass1装置中?到目前为止,它正在调用实际的函数,而不是mock***
class_one->doThatThing();
EXPECT_CALL(mockObj,doThatThing());
}

我必须抽象和简化实际的代码,因此我希望上面的内容有意义。

假设您的
MockClass2
工作正常,您应该尝试以下方法:

在这里,您应该覆盖在每次调用测试函数之前调用的函数
SetUp
,以准备测试数据。并重写每次调用测试函数后调用的
TearDown
,以清除测试数据

struct TestClass1 : public ::testing::Test
{
    void SetUp() override
    {
        class_two_mock = std::make_shared<MockClass2>();
        class_one = std::make_unique<Class1>(class_two_mock);        
    }
    void TearDown() override
    {
        class_one.reset();
        class_two_mock.reset();
    }

    std::shared_ptr<MockClass2> class_two_mock
    std::unique_ptr<Class1> class_one;
};

您可能需要
Class2
的接口。这里的代码没有经过测试。

GoogleMock不是魔法(唉!),当它最初不是这样的时候,就不能使它具有多态性。您需要在原始代码中使用虚拟函数或模板来模拟它。关闭。。。。但不太管用。由于Class2没有默认构造函数,MockClass2的默认构造函数被隐式删除,这使得此行抛出一个错误:
class_two\u mock=std::make_shared()我尝试添加MockClass2(){};但收到一个错误,我需要显式初始化Class2。增加了'Class3*Class3_ptr=new Class3();第二类(第三类)`它说“用不同类型的Class2和class3*重新定义class3\u ptr”??是的,这就是为什么我建议使用
Class2
接口的原因。这是唯一的选择吗?我想避免编辑源代码。正如Valeriy Savchenko在评论中提到的,这似乎是不可能的。顺便说一句,假设您的测试是正确的,但失败了,那么您不会修复类/代码吗?如果是这样的话,测试是不必要的。
TEST_F(TestClass1, doThatThingTest)
{
    EXPECT_CALL(*class_two_mock, doThatThing());

    class_one->doThatThing();
}