📝

【GoogleTest】ポインタ関係のテスト方法

2020/09/27に公開

※ここでは引数の数を 0 から数える。

引数チェック

ポインタ引数が指す値をチェック

Matcherの Pointee(期待値) でチェックできる。

先にテストケース外で名前空間を宣言しておく。

using ::testing::Pointee;

使い方

// 第2引数が指す値が10であることをチェック
EXPECT_CALL(*mock, func(_, _, Pointee(10))).WillOnce(//省略

ポインタ引数(配列)が指す領域をチェック

ElementsAreArray()With() の中で使ってチェックする

EXPECT_CALL(/*省略*/)
	.With(Args<配列ポインタ引数の場所(0基準), データ長の場所(0基準)>
		(ElementsAreArray(期待するデータを持つ配列));

使い方

UINT8 array[8] = { 0, 1, 2, /* 省略 */ };
EXPECT_CALL(*mock, func(_,sizeof(array),_,_)).
	With(Args<0,1>(ElementsAreArray(array))). // 以下省略

ElementsAreArray の引数に(配列でない)ポインタを設定する場合は、配列サイズも渡すとビルドできる

UINT8 array[8] = { 0, 1, 2, /* 省略 */ };
UINT8* arrayAddr;
arrayAddr = array;
EXPECT_CALL(*mock, func(_,sizeof(array),_,_))
  .With(Args<0,1>(ElementsAreArray(*(UINT8(*)[8])&arrayAddr))). // 以下省略

Matcherを作成する場合

Matcherの戻り値が true のときテストは成功、 false のとき失敗する。

MATCHER_P(ArrayPointee, expectArray, "") {
	// arg は関数呼び出し時に引数へ渡された値
	return (memcmp(arg, expectArray, sizeof(expectArray)) == 0);
}

// サイズ指定もする場合
// 引数の数を増やすときは MATCHER_Pn の n を合わせて増やす
MATCHER_P2(ArrayPointeeSize, expectArray, size, "") {
	return (memcmp(arg , expectArray, size) == 0);
}

使い方

byte expectArray[] = {0x11, 0x22, 0x33, 0x44};

// 第0引数の配列がexpectArrayと等しいことをチェック
EXPECT_CALL(*mock, myMemCmp(ArrayPointee(expectArray), 0xFF, 4))
	.WillOnce(//省略

ポインタ引数(構造体)が指す領域をチェック

専用のMatcherを作成する。

MATCHER_P(XxxDataEq, value, "") {
	const XXX_DATA* target = reinterpret_cast<const XXX_DATA*>(arg);
	const XXX_DATA* expected = reinterpret_cast<const XXX_DATA*>(value);

	return (
target->dataLength == expected->dataLength)
 || /*他の要素も比較する*/);
}

使い方

XXX_DATA* expectXxxData = {/* 期待するデータを設定 */};
EXPECT_CALL(*mock, func(XxxDataEq(expectXxxData),_)).// 省略

モックへの入力設定

引数が指す先に配列を設定する

以下の関数に対してテスト実行中に引数 inputArr へ配列を設定する。

void func(char[] inputArr, int size);

Actions の SetArrayArgument<N>(fast, last) を使う。

  • 各要素の意味
    • N: 引数の位置(0基準)
    • fast: 設定したい配列の先頭アドレス
    • last: 設定したい配列の終端の次のアドレス
char inputArr[] = { 0x11, 0x22, 0x33, 0x44 }; //4バイト分の配列

EXPECT_CALL(*mock, func(_,_)).WillOnce(
	SetArrayArgument<0>(inputArr, inputArr + sizeof(inputArr)));

出力設定

ポインタ引数に戻り値を設定

以下の関数に対してテスト実行中に引数 output へ値を設定する。

void func(int input, int size, int *output);

Actions の SetArgPointee<N>(value) を使う。

  • 各要素の意味
    • N: 引数の位置(0基準)
    • value: 設定したい値
// output に5を設定
EXPECT_CALL(*mock, func(_,_,_)).WillOnce(SetArgPointee<2>(5));

参考

Discussion