• このエントリーをはてなブックマークに追加

今日は体調不良のため、定時退社というなの早退をして、
家に帰ってきた瞬間に治ったので、ブログを更新してみる。

今の開発だと、制御用のメモリを構造体ポインタの形でやり取りすることが多い。
構造体ポインタを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]