GoogleMock显示更详细的调试信息

use*_*879 6 c++ googletest googlemock

我在工作时使用googlemock.我们经常使用EXPECT_THROW,EXPECT_NO_THROW等...

我的问题是,当一个函数包含在EXPECT_NO_THROW中时,你如何让googlemock输出异常细节和堆栈跟踪,但实际上会引发异常(即代码错误)?

我得到的唯一输出是它抛出一个异常并且测试失败...这对于调试根本原因没有用.

Fra*_*ser 2

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

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

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

#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.")
Run Code Online (Sandbox Code Playgroud)

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