📝
【GoogleTest】ポインタ関係のテスト方法
※ここでは引数の数を 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));
参考
- チートシート - Google Mock ドキュメント 日本語訳<http://opencv.jp/googlemockdocs/cheatsheet.html >
Discussion