私はGoogle Test and Mockフレームワークの初心者です。Google Mockでダブルフリー
私はちょうど "タートル"の例を実行しようとすると、それは成功しました。
ただし、エラーメッセージが表示されました:ダブルフリーまたは破損(!prev)。
MockTurtle.h
#include <gmock/gmock.h>
class MockTurtle : class Turtle {
MOCK_METHOD0(PenUp, void());
MOCK_METHOD0(PenDown, void());
MOCK_METHOD1(Forward, void(int distance));
MOCK_METHOD1(Turn, void(int degrees));
MOCK_METHOD2(GoTo, void(int x, int y));
MOCK_CONST_METHOD0(GetX, int());
MOCK_CONST_METHOD0(GetY, int());
};
Turtle.h
class Turtle {
virtual ~Turtle() {}
virtual void PenUp() = 0;
virtual void PenDown() = 0;
virtual void Forward(int distance) = 0;
virtual void Turn(int degrees) = 0;
virtual void GoTo(int x, int y) = 0;
virtual int GetX() const = 0;
virtual int GetY() const = 0;
};
Painter.h
class Painter
{
Turtle* turtle;
public:
Painter(Turtle* turtle)
: turtle(turtle){}
bool DrawCircle(int, int, int){
turtle->PenDown();
return true;
}
};
Main_test.cpp
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Painter.h"
#include "MockTurtle.h"
using ::testing::AtLeast;
TEST(PainterTest, CanDrawSomething) {
MockTurtle turtle;
EXPECT_CALL(turtle, PenDown())
.Times(AtLeast(1));
Painter painter(&turtle);
EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}
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();
}
結果
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from PainterTest
[ RUN ] PainterTest.CanDrawSomething
[ OK ] PainterTest.CanDrawSomething (0 ms)
[----------] 1 test from PainterTest (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[ PASSED ] 1 test.
*** Error in `/home/user/workspace/google_mock_2/Debug/google_mock_2': double free or corruption (!prev): 0x098a8080 ***
私はいくつかの同じ問題を見て、グーグルしてみました。人々は、グローバル変数としてモックを使うべきではないと言いました。
しかし、私の例ではグローバル変数は使用されませんでした。
ダブルフリーの理由を説明してください。 ありがとうございます!
すでにソースコードを追加しています。それは私の例ではすべてです。 – quangdien