使用谷歌测试,我想检查如果我调用另一个类方法,是否会调用某些类方法。
#include "gtest/gtest.h"
class Foo {
void DoWorkPrivate(int i) {}
public:
void DoWork(int i) {}
void Run() {
for (int i = 1; i <= 5; i++) {
DoWork(i);
DoWorkPrivate(i);
}
}
};
TEST(FooTest, Run) {
Foo foo;
foo.Run(); // Need to check that DoWork() and DoWorkPrivate() are invoked
}
Run Code Online (Sandbox Code Playgroud)
问题:
如何检查DoWork()和DoWorkPrivate()被使用某些参数(1、2、3、4、5)调用 5 次?
在这种情况下,通常的方法是创建一个模拟对象。有很多关于模拟和不同类型的模拟的文献和文章。所以我不会在这里深入讨论细节。例如福勒关于嘲笑。
但一般来说,您可以对您期望的方法调用进行子类化(或者通常是类的接口)。
对于你的例子来说这意味着:
class FooMock : public Foo {
public:
bool isDoWorkPrivateCalled() {
return isDoWorkPrivatecall;
}
private:
DoWorkPrivate(int i) { isDoWorkPrivatecall = true;}
bool isDoWorkPrivatecall = false;
}
TEST(FooTest, Run) {
Foo *foo = new FooMocK();
foo->Run();
EXPECT_TRUE(foo->isDoWorkPrivateCalled());
}
Run Code Online (Sandbox Code Playgroud)
是的,这意味着必须保护私有方法。
至少我建议使用gmock。模拟框架通过模拟功能扩展了 gtest。使用 gmock 你可以模拟一个方法
MOCK_METHOD1(DoWorkPrivate, void(int i));
Run Code Online (Sandbox Code Playgroud)
然后在您的具体情况下,测试将如下所示:
EXPECT_CALL(foo, DoWorkPrivate(1)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(2)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(3)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(4)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(5)).Times(1);
Run Code Online (Sandbox Code Playgroud)