首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用expect_call在gtest和测试中模拟一个纯虚拟函数

用expect_call在gtest和测试中模拟一个纯虚拟函数
EN

Stack Overflow用户
提问于 2021-07-13 10:18:08
回答 1查看 945关注 0票数 0

我正在尝试使用gtest测试来自另一个函数的函数调用。头文件和cpp文件的简化版本是:Sample.h

代码语言:javascript
复制
class Sample {
public:
   Sample();
   ~Sample();
   void funcA();
protected:
   virtual void funcB()=0;
};

Sample.cpp中,funcA调用funcB。

代码语言:javascript
复制
funcA() {
   funcB();
}

代码按预期工作,但编写其单元测试失败。我编写的单元测试示例如下:

testSample.cpp

代码语言:javascript
复制
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "Sample.h"

class SampleMock : public Sample {
public:
    SampleMock(): SampleMock(){};
    virtual ~SampleMock(){};
    MOCK_METHOD0(funcB, void());
};

class SampleTest : public ::testing::Test {
protected:
    void SetUp() override
    {
        sample = new SampleMock();
    }

    void TearDown() override
    {
        delete sample;
    }
    Sample* sample;
};

TEST_F(SampleTest, Test1)
{
    SampleMock tempObj;
    EXPECT_CALL(tempObj, funcB);
    sample->funcA();
}
}

我希望运行一个测试,并确保在调用funcA时调用funcB。但运行此测试会引发错误。

代码语言:javascript
复制
Undefined symbols for architecture x86_64:
  "Sample::funcA()", referenced from:
      SampleTest_Test1_Test::TestBody() in testSample.o
  "Sample::Sample(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      SampleMock::SampleMock() in testSample.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2021-07-13 16:04:22

您展示的代码示例有几处问题:

您是从Sample继承的,因此请更改以下内容:

代码语言:javascript
复制
~Sample();

至:

代码语言:javascript
复制
virtual ~Sample() = default;

同样在SampleMock类中,构造函数委托给自己:

代码语言:javascript
复制
SampleMock(): SampleMock(){};

你可能是想:

代码语言:javascript
复制
SampleMock(): Sample(){};

代码语言:javascript
复制
SampleMock* sample; // instead of Sample* sample

关于您的测试,EXPECT_CALL需要一个模拟。我不太清楚测试的目的是什么。无论如何,这应该会让您通过编译:

使funcA虚拟:virtual void funcA()

被嘲弄的类会变成这样

代码语言:javascript
复制
class SampleMock : public Sample {
public:
  MOCK_METHOD(void, funcB, (), (override));
  MOCK_METHOD(void, funcA, (), (override));
};

SampleTest

代码语言:javascript
复制
class SampleTest : public ::testing::Test {
public:
  // ...
  SampleMock* sample;
};

一旦funcA将它委托给基,测试就会被调用,我们期望funcB也会被调用。

代码语言:javascript
复制
TEST_F(SampleTest, Test1)
{
  EXPECT_CALL(*sample, funcA).WillOnce([this]() {
    sample->Sample::funcA();
  });

  EXPECT_CALL(*sample, funcB).Times(1);

  sample->funcA();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68360545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档