如何在构造函数中设置函数调用的期望值?
How to set expectation on the function calls inside the constructor?
我正在使用 google test(gtest/gmock) 为程序 (C++) 添加几个测试。对于其中一个 class,我必须添加一个测试以确保 class 在其构造函数中调用一个函数(假设是一个我不想错过的重要函数)。
例如:
class foo
{
foo()
{
bar();
}
};
在这里,我需要添加一个测试以确保 bar()
在 foo 实例化中被调用。由于期望应该在动作之前添加,所以我发现很难添加这样的测试:
例如:
foo f; // here the bar is called, so we need to set expectation before it but we got the object at this moment only
我想用 EXPECT_CALL()
来完成这个任务。我是 google 测试的新手。让我知道我是否想清楚了,这里需要做什么?
更新:bar()
是foo
class的继承成员函数。我需要测试在进一步的变化中永远不会错过那个电话。该测试将确保调用始终存在,即使在对源代码进行了几次新修改之后也是如此。
通常你会测试一个 class(没有模拟)并模拟那个 class 的合作者(即与之交互的 classes)。正在测试的 class 不应同时被模拟。
但是,在您的用例中,您似乎正在尝试同时测试 class 和模拟相同的 class(或父 class)。
如果您想测试构造函数中是否调用了某些东西,我认为您不能特别使用 GMock 来执行此操作,因为 EXPECT_CALL
需要模拟 class 的对象,并且在您创建该对象时,构造函数被调用并完成。因此,您需要明确区分被模拟的 class-under-test 和合作者 class。
有趣的是,如果您尝试这样做 here you will get a warning for an uninteresting call to bar,这是 bar
被调用的标志,但它不是那么有用,因为当您收到警告时,您的测试将失败。
相反,我建议您创建并测试 bar()
的副作用,而不是使用模拟和 EXPECT_CALL
。为此,您必须稍微修改 class 定义。例如,你可以这样写:
class base {
void bar(){
//...
bar_was_called = true;
}
public:
bool bar_was_called=false;
};
class foo : public base
{
public:
foo()
{
bar();
}
};
TEST(foo, barWasCalled){
foo f;
EXPECT_TRUE(f.bar_was_called);
}
我正在使用 google test(gtest/gmock) 为程序 (C++) 添加几个测试。对于其中一个 class,我必须添加一个测试以确保 class 在其构造函数中调用一个函数(假设是一个我不想错过的重要函数)。
例如:
class foo
{
foo()
{
bar();
}
};
在这里,我需要添加一个测试以确保 bar()
在 foo 实例化中被调用。由于期望应该在动作之前添加,所以我发现很难添加这样的测试:
例如:
foo f; // here the bar is called, so we need to set expectation before it but we got the object at this moment only
我想用 EXPECT_CALL()
来完成这个任务。我是 google 测试的新手。让我知道我是否想清楚了,这里需要做什么?
更新:bar()
是foo
class的继承成员函数。我需要测试在进一步的变化中永远不会错过那个电话。该测试将确保调用始终存在,即使在对源代码进行了几次新修改之后也是如此。
通常你会测试一个 class(没有模拟)并模拟那个 class 的合作者(即与之交互的 classes)。正在测试的 class 不应同时被模拟。
但是,在您的用例中,您似乎正在尝试同时测试 class 和模拟相同的 class(或父 class)。
如果您想测试构造函数中是否调用了某些东西,我认为您不能特别使用 GMock 来执行此操作,因为 EXPECT_CALL
需要模拟 class 的对象,并且在您创建该对象时,构造函数被调用并完成。因此,您需要明确区分被模拟的 class-under-test 和合作者 class。
有趣的是,如果您尝试这样做 here you will get a warning for an uninteresting call to bar,这是 bar
被调用的标志,但它不是那么有用,因为当您收到警告时,您的测试将失败。
相反,我建议您创建并测试 bar()
的副作用,而不是使用模拟和 EXPECT_CALL
。为此,您必须稍微修改 class 定义。例如,你可以这样写:
class base {
void bar(){
//...
bar_was_called = true;
}
public:
bool bar_was_called=false;
};
class foo : public base
{
public:
foo()
{
bar();
}
};
TEST(foo, barWasCalled){
foo f;
EXPECT_TRUE(f.bar_was_called);
}