如果我处于需要测试可能调用另一个成员函数的公共函数的情况下,如果我模拟一个函数并测试另一个函数的原始功能,它仍然是一个有效的测试吗?或者我现在正在测试模拟对象这一事实是否会使我的测试无效?
我只对测试下面的 A() 感兴趣。非常感谢您的任何见解
class RealClass {
public:
int A() { return B(); }
private:
virtual int B() {
//perform some heavy computation and return 5
return 5;
}
};
class MockClass : public RealClass {
public:
MOCK_METHOD(int, B, (), (override));
};
// Is this a valid test of RealClass A() since
// I am using a Mocked RealClass here
TEST(MyTestSuite, TestA) {
MockClass myMockClass;
ON_CALL(myMockClass, B).WillByDefault(Return(5));
int result = myMockClass.A();
EXPECT_EQ(result, 5);
}
// Would I have to figure out some other way to test with an actual
// RealClass myRealClass object
我期望 A() 将测试 RealClass::A() 因为没有覆盖,但我只是想确保我不会在这里通过测试模拟对象来搬起石头砸自己的脚
是的,它会工作,但不会测试
RealClass
,你可能想默认调用和返回RealClass::B()
而不是5:
class RealClass {
public:
int A() { return B(); }
protected:
virtual int B() {
//perform some heavy computation and return 5
return 5;
}
};
class MockClass : public RealClass {
public:
MockClass() {
ON_CALL(*this, B).WillByDefault([this]() {
return RealClass::B();
});
}
MOCK_METHOD(int, B, (), (override));
};
TEST(MyTestSuite, TestA) {
MockClass myMockClass;
int result = myMockClass.A();
EXPECT_EQ(result, 5);
}