我正在尝试使用gtest测试来自另一个函数的函数调用。头文件和cpp文件的简化版本是:Sample.h
class Sample {
public:
Sample();
~Sample();
void funcA();
protected:
virtual void funcB()=0;
};在Sample.cpp中,funcA调用funcB。
funcA() {
funcB();
}代码按预期工作,但编写其单元测试失败。我编写的单元测试示例如下:
testSample.cpp
#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。但运行此测试会引发错误。
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)我在这里做错什么了?
发布于 2021-07-13 16:04:22
您展示的代码示例有几处问题:
您是从Sample继承的,因此请更改以下内容:
~Sample();至:
virtual ~Sample() = default;同样在SampleMock类中,构造函数委托给自己:
SampleMock(): SampleMock(){};你可能是想:
SampleMock(): Sample(){};SampleMock* sample; // instead of Sample* sample关于您的测试,EXPECT_CALL需要一个模拟。我不太清楚测试的目的是什么。无论如何,这应该会让您通过编译:
使funcA虚拟:virtual void funcA()
被嘲弄的类会变成这样
class SampleMock : public Sample {
public:
MOCK_METHOD(void, funcB, (), (override));
MOCK_METHOD(void, funcA, (), (override));
};SampleTest:
class SampleTest : public ::testing::Test {
public:
// ...
SampleMock* sample;
};一旦funcA将它委托给基,测试就会被调用,我们期望funcB也会被调用。
TEST_F(SampleTest, Test1)
{
EXPECT_CALL(*sample, funcA).WillOnce([this]() {
sample->Sample::funcA();
});
EXPECT_CALL(*sample, funcB).Times(1);
sample->funcA();
}https://stackoverflow.com/questions/68360545
复制相似问题