【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));  

参考