首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GoogleMock显示更详细的调试信息

GoogleMock显示更详细的调试信息
EN

Stack Overflow用户
提问于 2012-07-12 02:56:47
回答 4查看 2.3K关注 0票数 7

我工作时用的是googlemock。我们经常使用EXPECT_THROW,EXPECT_NO_THROW等。

我的问题是,当一个函数被包装在一个EXPECT_NO_THROW中,但实际上抛出了一个异常(即代码错误)时,如何让googlemock输出异常详细信息,也许还有堆栈跟踪?

我得到的唯一输出是它抛出了一个异常,并且失败了,test...which对于调试根本原因没有用处。

EN

回答 4

Stack Overflow用户

发布于 2012-07-12 07:44:38

EXPECT_THROWEXPECT_NO_THROW等实际上是Google Test的一部分,而不是Google Mock。

除了破解gtest源代码之外,我不知道有什么方法可以获得关于这个异常的更多信息。仅对于std::exceptions,以下更改应至少在EXPECT_NO_THROWASSERT_NO_THROW失败时输出异常的what()

在第1140行周围的gtest/include/gtest/internal/gtest-internal.h,中,将GTEST_TEST_NO_THROW_宏更改为:

代码语言:javascript
复制
#define GTEST_TEST_NO_THROW_(statement, fail) \
  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
  if (::testing::internal::AlwaysTrue()) { \
    try { \
      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
    } \
    catch (...) { \
      try { \
        std::exception_ptr exceptn_ptr(std::current_exception()); \
        std::rethrow_exception(exceptn_ptr); \
      } catch(const std::exception& exceptn) { \
        std::cerr << exceptn.what() << '\n'; \
      } \
      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
    } \
  } else \
    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
      fail("Expected: " #statement " doesn't throw an exception.\n" \
           "  Actual: it throws.")

显然,您可以在此处添加更多功能;捕获自定义异常类型,格式化包含异常信息的失败消息,等等。

票数 2
EN

Stack Overflow用户

发布于 2015-05-04 18:00:50

你也可以一起省略断言,让你的测试用例抛出一个异常。因此,不是断言f()不会抛出:

代码语言:javascript
复制
ASSERT_NO_THROW(f());

您只需调用该函数:

代码语言:javascript
复制
f();

如果它抛出一个异常,它会给你一个类似这样的输出:

代码语言:javascript
复制
C++ exception with description "something broke in f()" thrown in the test body.

当然,这只适用于ASSERT_NO_THROW,因为测试用例将终止。

票数 1
EN

Stack Overflow用户

发布于 2015-05-04 20:02:35

一般来说,GMock/GTest不能对捕获的对象做任何事情。它不能简单地假设您的代码抛出了您希望的std::exception子类,并且C++不提供任何在引发异常时保存堆栈跟踪的方法,即使堆栈帧和调试符号实际上存在于您的二进制文件中也是如此。

但话说回来,单元测试实际上是一种用于验证的技术,而其他工具必须是您的诊断工具。无论是添加临时日志(如printf)还是交互式调试器(如gdb ),都有更好的工具来完成这项工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11439525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档