2017-12-13 45 views
-1

生のダブルポインタを持つメソッドを模倣します。例えば、ヘルパークラスの下にメソッドint run(int ** a)があります。 SetArgPointeeを使用して期待値を設定しようとしていますが、動作しません。コンパイラエラーがint ** const int *に変換できません。doubleポインタを引数として持つ関数をモックする

class Helper { 
    public: 
     MOCK_METHOD1(run, int(int ** a)); 
    }; 

    int** test = new int*[2]; 

    test[0] = new int[1]; 
    test[0][0] = 5; 

    test[1] = new int[1]; 
    test[1][0] = 55; 

    int** test2 = new int*[2]; 

    test2[0] = new int[1]; 
    test2[0][0] = 10; 

    test2[1] = new int[1]; 
    test2[1][0] = 110; 

    Helper helper; 
    EXPECT_CALL(helper, run(_)) 
     .Times(1) 
     .WillOnce(DoAll(SetArgPointee<0>(test2), Return(99))); 

    int rc = helper.run(test); 

test double pointerをtest2に置き換えることができません。どのようにそれを行うことができるか知りたい。

+0

「ヘルパー」とは何ですか? [MCVE](https://stackoverflow.com/help/mcve)を見たいかもしれません。 – Labonneguigue

+0

クラスヘルパー{ public: MOCK_METHOD1(run、int(int ** a)); }; – user3699160

+0

'ベクトル'は使用できません。 – Labonneguigue

答えて

0

これは完全な回答ではありませんが、コメントのためには長すぎるため投稿します。

最初に、何を達成しようとしているのかを説明するべきでしょう。通常、修正されたargを使って何かをやろうとしないならば、呼び出されたモック関数の引数を設定する理由はありません。このメモリポインタが指しているので

SetArgPointeeのみ、あなたがa[0]に値を設定することができます。しかし

int** mockInput1 = new int*[2]; 
int** mockInput2 = new int*[2]; 
EXPECT_CALL(helper, run(_)) 
    .Times(1) 
    // this will set value pointed by mockInput2[0] to mockInput1[0] 
    .WillOnce(DoAll(SetArgPointee<0>(mockInput1[0]), Return(99))); 
helper.run(mockInput2); 

、私は、これはあなたが探しているではないものをことをほとんど確信しています。あなたがやりたいことができますアクション内

auto action = [](int** a) { 
    int** test = new int*[2]; 
    test[0] = new int[1]; 
    test[0][0] = 5; 
    test[1] = new int[1]; 
    test[1][0] = 55; 
    a[0] = test[0]; 
    a[1] = test[1]; // or whatever 
    std::cout << "Executed custom action" << std::endl; 
}; 
EXPECT_CALL(helper, run(_)) 
    .Times(1) 
    .WillOnce(DoAll(Invoke(action), Return(99))); 
helper.run(mockInput2); 

:そのgmockはあなたの呼び出しが一致した後に呼び出すことができるカスタムアクションを定義することができます注意してください。とにかく、実際に達成しようとしていることを説明しよう。

また、メモリを適切に削除しないと、メモリリークの可能性はありません。

関連する問題