我有以下的类(这是实际类的一个非常简化的版本。
class PostCalc
{
public:
virtual int add(int a, int b) { return a+b; } // Actual function is complex
virtual int multiply(int a, int b) { return a*b; } // So this one
virtual int multiop(int a, int b) { return add(a, b) + multiply(a, b); }
};
例如,如果我想对以下类进行单元测试 multiop()
并模拟其他成员函数[。add()
和 multiply()
],我们如何才能实现呢?我想创建PostCalc的模拟类,gmocked add()
和 multiply()
并创建了一个委托函数,用于 multiop()
.
class PostCalcMock : public PostCalc
{
public:
MOCK_METHOD2(add, int(int a, int b));
MOCK_METHOD2(multiply, int(int a, int b));
// Delegate
int delegateToMultiOp(int a, int b) {
return multiop(a, b);
}
};
这样的处理方式好吗?希望得到任何帮助。
先谢谢你了。
你不需要 delegateToMultiOp
. 总是专注于测试你想要的公共行为。我在这里可以看出,你的意图是,每当有人呼叫 multiop
,其结果是 add
和 multiply
将被称为。
namespace {
class PostCalc {
public:
virtual int add(int a, int b) { return a + b; } // Actual function is complex
virtual int multiply(int a, int b) { return a * b; } // So this one
virtual int multiop(int a, int b) { return add(a, b) + multiply(a, b); }
};
class PostCalcMock : public PostCalc {
public:
MOCK_METHOD2(add, int(int a, int b));
MOCK_METHOD2(multiply, int(int a, int b));
};
struct MultipleOperationsTest : public testing::Test {};
} // namespace
TEST_F(MultipleOperationsTest, ExpectsToConfirmThatAddAndMultiplyIsCalled) {
PostCalcMock mock;
int a = 2, b = 3;
EXPECT_CALL(mock, add(a, b));
EXPECT_CALL(mock, multiply(a, b));
mock.multiop(a, b);
}