GoogleMockのモックメゾッドにC言語の構造体ポインタを渡してみた

今日は体調不良のため、定時退社というなの早退をして、

家に帰ってきた瞬間に治ったので、ブログを更新してみる。

今の開発だと、制御用のメモリを構造体ポインタの形でやり取りすることが多い。

構造体ポインタをGoogleMockの モックメゾッド(MOCK_METHODx)にわたすと、

コンパイルが通らない。悩んだ上げく、以下の方法でできた。

Mockオブジェクトの中で、構造体をメンバごとに分解して、渡してやる

MOCK_METHODに渡すときには、構造体のメンバごとに引数に渡してやればいいだけ。

[C]

typedef struct hogehoge {

int x;

int y;

}HOGE;

[/C]

なので、構造体の場合は、

MOCK_METHOD0(hoge);

だとエラーするので、

MOCK_METHOD2(hoge->x, hoge->y);

と分解すればよい。

前回エントリのサンブルソースを少し改造

sample.c

[C]

include “sample.h”

int get_ret(void)

{

int num = 0;

int ret;

NUM dummy;

dummy.num = 2;

dummy.count = 3;

/\N 数をライブラリより取得 */

num = get_num(&dummy);

/\N 結果によって分岐 */

if( num == 1 ) {

ret = 10;

}

else if( num == 2 ){

ret = 20;

}

else {

ret = 30;

}

return ret;

}

[/C]

numlib.h

[C]

typedef struct NUM

{

int num;

int count;

}NUM;

ifdef __cplusplus

extern “C” {

endif

extern int(*get_num)(NUM *num);

[/C]

gmock_test.cpp

[C]

extern “C”

{

include “sample.h”

}

include “gtest/gtest.h” /\N GoogleTest インクルード */

include “gmock/gmock.h” /\N GoogleMock インクルード */

using ::testing::Return;

using ::testing::_;

using ::testing::Eq;

/\N モッククラス */

class MockNum

{

public:

MOCK_METHOD2(get_num2, int(int num, int count) );

} mock;

int Mockget_num(NUM *num)

{

return mock.get_num2(num->num, num->count);

}

/\N get_num 実体 */

int (*get_num)(NUM *num);

/\N テスト */

class MockNumTest : public ::testing::Test

{

int (*savedget_num)(NUM *num);

virtual void SetUp()

{

savedget_num = get_num;

get_num = Mockget_num;

}

virtual void TearDown()

{

get_num = savedget_num;

}

};

TEST_F(MockNumTest, return1)

{

EXPECT_CALL(mock, get_num2(_,_) )

.WillOnce(Return(1));

EXPECT_EQ(10, get_ret() );

}

TEST_F(MockNumTest, return2)

{

EXPECT_CALL(mock, get_num2(2,3) ).WillOnce(Return(2));

EXPECT_EQ(20, get_ret() );

}

TEST_F(MockNumTest, return3)

{

EXPECT_CALL(mock, get_num2(Eq(2),Eq(3)) ).WillOnce(Return(3));

EXPECT_EQ(30, get_ret() );

}

[/C]