9

googletest で googlemock を使い始めていますが、理解できない 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

3

gmock をDLLとしてコンパイルし、別のプロジェクトにリンクしたときに、同じ問題に遭遇しました。いろいろ試した結果、以下の理由がわかりました。

gmock とプロジェクトを同じ構成でコンパイルする必要があります。

つまり、DEBUG(RELEASE) モードでリンクする場合は、DEBUG(RELEASE) 構成で gmock をコンパイルする必要があります。そうでない場合、

不明なファイル: エラー: コード 0xc0000005 の SEH 例外がテスト本体でスローされました。

常に発生します。

別のシーンでこの問題に遭遇するかもしれませんが、私の経験があなたの助けになれば幸いです。

于 2014-12-10T07:58:25.027 に答える