因此,我试图学习如何编写单元测试,但我偶然发现了这个问题,我不知道如何创建模拟对象。这是我的示例:我有这个课:
class FooChild
{
public:
void doThis();
bool doThat(int n, double x);
};
这是我要测试的另一个类中的方法:
#include "FooFighter.h"
#include "FooChild.h"
void FooFighter::doSomething()
{
FooChild fooChild;
fooChild.doThis();
fooChild.doThat(4, 5);
}
我想测试事物是否调用了该方法以及执行了多少次。Google模拟纪录片说,只有带有虚拟方法的Abstract类才能被模拟。这就是为什么我尝试创建FooChild的父类,如下所示:
class Foo
{
public:
virtual void doThis() = 0;
virtual bool doThat(int n, double x) = 0;
};
然后创建一个类似Foo的模拟类:
#include "gmock/gmock.h"
class MockFoo : public Foo
{
public:
MOCK_METHOD(void, doThis, (), (override));
MOCK_METHOD(bool, doThat, (int n, double x), (override));
};
然后我尝试编写doSomething的测试:
TEST_F(FooFighterTest, doSomethingTest)
{
MockFoo mock_foo
mock_foo.doThis()
.Times(1);
}
显然,这是行不通的,我有种感觉,我完全误解了模拟的工作原理,但是我似乎无法找到关于如何创建模拟的简单明了的解释。任何帮助或建议都很好。同样,我关于如何测试void函数的方法可能是完全错误的,因此,有关如何测试不返回任何内容的函数的任何建议也都很好。
除非您没有将它们放在这里,否则您会丢失很多东西。慢慢阅读googletests的文档,尤其是mocks的文档。这就是我通常定义模拟的方式:
#include <gmock/gmock.h>
#include "Foo.hpp"
class MockFoo : public Foo {
public:
MOCK_METHOD0(doThis, void());
MOCK_METHOD2(doThat, bool(int n, double x));
};
您需要在表达式MOCK_METHOD
之后写出方法的参数数量,然后是返回类型,并在括号之间输入参数类型。如果您不想为此担心,请使用库中的this nice generator。
然后在测试本身中定义模拟的行为,这就是它的要点,您可以为所有测试做一个通用定义,或对其中的某些测试进行更改以使其工作不同。
我认为写一个完整的示例没有意义,因为您有in the tutorials really good and simple ones,所以请检查一下。