gpt4 book ai didi

c++ - Googlemock 在测试退出时错误地报告错误。我究竟做错了什么?

转载 作者:太空狗 更新时间:2023-10-29 21:06:02 35 4
gpt4 key购买 nike

Googlemock 在测试退出时错误地报告了问题。我究竟做错了什么?我已经搜索了 googlemock 文档,但没有完整的示例,也没有描述我遇到的问题。

我得到的错误是:

googlemocktest.cpp(53): ERROR: this mock object should be deleted but never is.
Its address is @0018FDC4.
ERROR: 1 leaked mock object found at program exit.

简单测试的代码是:

#include <string>
#include <iostream>
#include <memory>
#include "gmock/gmock.h"

class IBar
{
public:
virtual ~IBar() {}
virtual void b() = 0;
virtual int c(std::string) = 0;
};

class Foo
{
private:
IBar *bar_;
public:
Foo(IBar *bar);
int a();
};

Foo::Foo(IBar *bar)
: bar_(bar)
{
}

int Foo::a()
{
// bar_->b();
return bar_->c("hello");
}

class BarMock : public IBar
{
public:
MOCK_METHOD0(b, void());
MOCK_METHOD1(c, int(std::string));
};

using ::testing::Return;

void TestAFunctionInFoo()
{
try
{
BarMock barMock;
std::unique_ptr<Foo> newFoo(new Foo(&barMock));

EXPECT_CALL(barMock, b());
EXPECT_CALL(barMock, c("hello")).WillOnce(Return(42));

newFoo->a();
}
catch (std::exception& e)
{
std::cout << "Mock exception caught: " << e.what() << std::endl;
}
catch (...)
{
}
}

int main(int argc, char* argv[])
{
::testing::GTEST_FLAG(throw_on_failure) = true;
::testing::InitGoogleMock(&argc, &argv[0]);
TestAFunctionInFoo();
return 0;
}

我已经用调试器验证 IBar::~IBar() 确实被调用了。但我仍然收到此错误消息。如果我在 Foo::a() 中取消注释对 IBar::b() 的调用,则没有测试失败,因此不会调用 catch 语句。调用了 IBar::~IBar(),但没有错误消息指示未删除模拟对象。

非常非常感谢您的帮助!

最佳答案

发生这种情况是因为您启用了 throw_on_failure 标志 - 正如 Google Mock ForDummies 中提到的那样:

This approach has a catch: it makes Google Mock throw an exception from a mock object's destructor sometimes.

由于从析构函数中抛出异常,模拟对象永远不会被完全删除,并且框架会在程序结束时提示它。

解决此问题的最简单方法是使用 Google Test 作为单元测试框架并禁用 throw_on_failure 标志(默认状态)- 如果未满足模拟预期,GTest 会自动失败测试。

如果您因为使用其他框架(例如 CppUnit)而无法使用 Google Test,您可以这样重写您的测试主体:

void TestAFunctionInFoo()
{
::testing::GTEST_FLAG(throw_on_failure) = true;
BarMock barMock;

try
{
std::unique_ptr<Foo> newFoo(new Foo(&barMock));

EXPECT_CALL(barMock, b());
EXPECT_CALL(barMock, c("hello")).WillOnce(Return(42));

newFoo->a();
::testing::Mock::VerifyAndClearExpectations(&barMock);
}
catch (std::exception& e)
{
// expectations failed - do whatever you want
}

::testing::GTEST_FLAG(throw_on_failure) = false;
}

VerifyAndClearExpectations(void*) 检查是否满足给定的模拟期望 - 如果不满足并且启用了 throw_on_failure 标志,它会抛出异常。

这样你的模拟对象将被正确销毁,如果出现问题你仍然会有异常。

顺便说一句:避免使用 catch (...) { } - 这通常是个坏主意,在大多数情况下证明代码质量很差。

关于c++ - Googlemock 在测试退出时错误地报告错误。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8426507/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com