14

ブール値を参照パラメーターとして受け取り、整数を返すクラスがあります。

class Foo
{
  public:
    Bar my_bar;
    virtual int myMethod(bool &my_boolean) = 0;
}

/*...*/

int Foo::myMethod(bool &my_boolean){
  if (my_bar == NULL){
    my_boolean = false;
    return -1;
  }
  else{
    my_boolean = true;
    return 0;
  }

}

そして、このクラスのモックを作成しました:

class MockFoo : public Foo
{
   MOCK_METHOD1(myMethod,int(bool &my_boolean));
}

単体テストを適切に作成するには、戻り値と参照パラメーターを特定の値に設定する必要があるため、この種の関数の期待値を設定する方法に問題があります。gmock でこの種の関数を処理するにはどうすればよいですか?ドキュメントの解決策と思われるものに従ってみました:

using ::testing::SetArgPointee;

class MockMutator : public Mutator {
  public:
  MOCK_METHOD2(Mutate, void(bool mutate, int* value));
  ...
};
  ...

MockMutator mutator;
EXPECT_CALL(mutator, Mutate(true, _))
  .WillOnce(SetArgPointee<1>(5));

しかし、私は例を理解していなかったか、このケースには当てはまりませんでした.誰かがこの種の状況を以前に扱ったことがありますか?

前もって感謝します。

4

1 に答える 1

18

あなたの質問はわかりにくいです!google mocks 'cook book' のサンプルも同様です。

モッククラスで実装を再利用したいですFoo::myMethod()か、それとも特定の呼び出し状況で副作用 (戻り値と ref パラメーターによって変更されたもの) をモックしたいだけですか?

モッククラスは通常、Fooクラスを直接継承したり、その動作を継承したりするのではなく、クラスを置き換え/シミュレートすることを目的としています。純粋なメソッドに対してこの「デフォルト」の動作を定義する方法が機能するかどうかはわかりませんが、それを疑ってください。then を単に省略してもかまいません= 0。より良いアプローチは、次のような実際のインターフェイス宣言を分離することです。

struct IFoo
{
    virtual int myMethod(bool &my_boolean) = 0;
    virtual ~IFoo() {}
};

class Foo : public IFoo
{
    // ...
};

class MockFoo : public IFoo
{
   MOCK_METHOD1(myMethod,int(bool &my_boolean));
};

後者の場合は、 and を使用する必要がありますtesting::Return(value)(testing::SetArgReferee<N>(value)非常に便利な「チート シート」に記載されています)。

期待値呼び出しは次のようになります。

MockFoo foo;

// Expect call to myMethod() return -1 and set the by ref argument to true
EXPECT_CALL(foo, myMethod(_))
  .WillOnce(DoAll(SetArgReferee<0>(true),Return(-1)));

// Expect call to myMethod() return 0 and set the by ref argument to false
EXPECT_CALL(foo, myMethod(_))
  .WillOnce(DoAll(SetArgReferee<0>(false),Return(0)));

元のクラスロジックを本当に再利用したい場合はmyMethod()「親クラスへの呼び出しの委任」をご覧ください。「実オブジェクトへの呼び出しの委譲」

于 2013-06-21T16:32:28.193 に答える