9

我开始将 googlemock 与 googletest 一起使用,但遇到了我无法弄清楚的 SEH 异常。

错误信息是:

unknown file: error: SEH exception with code 0xc0000005 thrown in the test body.

我已经阅读了一些关于 SO 和其他地方的类似问题,但还没有为这样一个简单的例子找到答案。

即这发生在我的真实代码上,但我也在下面非常简单的示例中重现了错误。我正在使用 MSVC2008 构建。

重现错误的代码:

#include "gtest/gtest.h"
#include "gmock/gmock.h"

#include <iostream>

using testing::Exactly;

class Production
{
public:
    virtual ~Production() {};
    virtual void fn() = 0;
};

class ProductionCode : public Production
{
public:
    virtual ~ProductionCode() {};
    void fn() 
    {
        std::cout << "CALLED ProductionCode::fn" << std::endl;
    }
};

class MockProduction : public Production
{
public:
    virtual ~MockProduction() {};
    MOCK_METHOD0(fn, void());
};

class ProductionUser
{
public:
    void methodUnderTest(Production *p)
    {
        p->fn();
    }
};

TEST(ProductionTest, CallTheProductionFunction) {
    ProductionCode p;

    ASSERT_NO_THROW( p.fn() );
}

TEST(ProductionTest, CallTheMethodUnderTest) {
    Production* p = new ProductionCode;
    ProductionUser u;

    ASSERT_NO_THROW( u.methodUnderTest(p) );

    delete p;
}

TEST(ProductionTest, CallTheMethodUnderTestWithMock) {
    MockProduction m;

    EXPECT_CALL(m, fn())
        .Times(Exactly(1));

    ProductionUser u;
    ASSERT_NO_THROW(u.methodUnderTest(&m));
}

我从控制台的测试输出:

[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from ProductionTest
[ RUN      ] ProductionTest.CallTheProductionFunction
CALLED ProductionCode::fn
[       OK ] ProductionTest.CallTheProductionFunction (4 ms)
[ RUN      ] ProductionTest.CallTheMethodUnderTest
CALLED ProductionCode::fn
[       OK ] ProductionTest.CallTheMethodUnderTest (2 ms)
[ RUN      ] ProductionTest.CallTheMethodUnderTestWithMock
unknown file: error: SEH exception with code 0xc0000005 thrown in the test body.

[  FAILED  ] ProductionTest.CallTheMethodUnderTestWithMock (0 ms)
[----------] 3 tests from ProductionTest (10 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (13 ms total)
[  PASSED  ] 2 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] ProductionTest.CallTheMethodUnderTestWithMock

 1 FAILED TEST

.\simple.cpp(59): ERROR: this mock object (used in test ProductionTest.CallTheMe
thodUnderTestWithMock) should be deleted but never is. Its address is @000000000
014F800.
ERROR: 1 leaked mock object found at program exit.
Press any key to continue . . .

我正在使用自己的主要功能如下:

#include "gtest/gtest.h"
#include "gmock/gmock.h"

int main(int argc, char** argv) {
    // The following line must be executed to initialize Google Mock
    // (and Google Test) before running the tests.
    ::testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

我猜我在这里犯了一个非常基本的错误,谁能看到我哪里出错了?谢谢!

[原始编辑以使代码和控制台输出匹配]

4

3 回答 3

4

我认为您可以强制 gtest 不要掩盖确切的异常(可以使用以下代码完成的操作:

::testing::GTEST_FLAG(catch_exceptions) = false;

或从命令行相同)如果然后你使用调试器,你很容易得到堆栈。或者即使你不这样做,我希望*nix-like OS 来编写核心文件

于 2016-02-12T13:59:11.090 回答
3

当我将 gmock 编译为DLL并将其链接到另一个项目中时,我遇到了同样的问题。经过大量尝试,我发现原因是:

您必须在相同的配置中编译 gmock 和您的项目!

这意味着你必须在 DEBUG(RELEASE) 配置中编译 gmock,如果你想在 DEBUG(RELEASE) 模式下链接它。如果没有,则

未知文件:错误:SEH 异常,代码为 0xc0000005 在测试主体中引发。

总是发生。

我希望我的经验可以帮助你,虽然你可能会在不同的场景中遇到这个问题。

于 2014-12-10T07:58:25.027 回答
2

我收到此错误是因为我取消了对空指针的引用。

于 2018-09-11T19:48:16.837 回答