作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的测试中有一个测试夹具,所以我不必重复实例化我的类的对象,但我不确定如何使用它进行模拟。简单来说,类是这样定义的:
class Class1 {
public:
Class1(std::shared_ptr<Class2> class_two);
void doThisThing() { doThatThing(); }
}
class Class2 {
public:
Class2(Class3* class3_ptr);
int doThatThing();
}
(类 1 使用指向类 2 的共享指针构造。类 2 使用指向类 3 的指针构造。类 1 调用函数“doThisThing”,该函数调用类 2 的函数 doThatThing。)
我需要为 doThatThing()(以及 Class2 的其余函数)创建模拟对象,但无法弄清楚如何将模拟对象传递给类 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());
}
我不得不抽象和简化实际代码,所以我希望上面的内容有意义。
最佳答案
假设您的 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;
};
在测试函数中,您必须在执行某些操作之前声明您的期望。
TEST_F(TestClass1, doThatThingTest)
{
EXPECT_CALL(*class_two_mock, doThatThing());
class_one->doThatThing();
}
您可能需要 Class2
的接口(interface)。这里的代码没有经过测试。
关于c++ - 如何在 GMock 中使用带有测试夹具的模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58940688/
我是一名优秀的程序员,十分优秀!