web-dev-qa-db-ja.com

Gmock-一致する構造

入力引数の共用体の要素の値をどのように一致させることができますか-たとえば、次の記号でメソッドをモックした場合-

    struct SomeStruct
    {   
        int data1;
        int data2; 
    };

    void SomeMethod(SomeStruct data);

引数の正しい値で呼び出されたこのメソッドのモックをどのように一致させることができますか?

11
NiladriBose

Googleモックのドキュメントを詳細に読んだ後、 Defining Matchers セクションに記載されているように問題を解決しました。 (例は素晴らしいでしょう!)

したがって、解決策はMATCHER_Pマクロを使用してカスタムマッチャーを定義することです。したがって、一致するSomeStruct.data1について、マッチャーを定義しました。

MATCHER_P(data1AreEqual, ,"") { return (arg.data1 == SomeStructToCompare.data1); }

期待通りに一致させるために、このカスタムマクロを次のように使用しました。

EXPECT_CALL(someMock, SomeMethod(data1AreEqual(expectedSomeStruct)));

ここで、expectedSomeStructは、予想されるstructure.data1の値です。

他の回答(この投稿など)で提案されているように、テスト対象のユニットを変更してテスト可能にする必要があることに注意してください。それは必要ないはずです!例えば。過負荷。

21
NiladriBose

構造体の1つのフィールド(またはクラスの1つの「プロパティ」)の特定の値を明示的にテストする必要がある場合、gmockは「フィールド」および「プロパティ」定義でこれをテストする簡単な方法を備えています。構造体で:

EXPECT_CALL( someMock, SomeMethod( Field( &SomeStruct::data1, expectedValue )));

あるいは、SomeClass(SomeStructの代わり)がある場合は、プライベートメンバー変数とパブリックゲッター関数があります。

EXPECT_CALL( someMock, SomeMethod( Property( &SomeClass::getData1, expectedValue )));
9
JukkaA

Googleは、サンプルコードが満載のgmockの使用に関する優れたドキュメントを提供しています。私はそれをチェックすることを強くお勧めします:

https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#using-matchers

ご指摘のとおり、デフォルトの等値演算子(==)は、クラスタイプ(PODを含む)に対して自動的に作成されません。この演算子はパラメーターを照合するときにgmockによって使用されるため、他の型と同じように型を使用するには、明示的に定義する必要があります(以下を参照)。

    // Assumes `SomeMethod` is mocked in `MockedObject`
    MockedObject foo;
    SomeStruct expectedValue { 1, 2 };

    EXPECT_CALL(foo, SomeMethod(expectedValue));

したがって、これを処理する最も簡単な方法は、構造体の等価演算子を定義することです。

struct SomeStruct
{   
    int data1;
    int data2; 

    bool operator==(const SomeStruct& rhs) const
    {
        return data1 == rhs.data1
            && data2 == rhs.data2;
    }
};

そのルートを使いたくない場合は、 フィールドマッチャー を使用して、そのメンバー変数の値に基づいてパラメーターを照合することを検討できます。 (ただし、テストが構造体のインスタンス間の等価性の比較に関心がある場合は、他のコードも関心があることを示す良い指標です。したがって、operator==そしてそれで終わります。)

6
Lilshieste

これは基本的に上記で回答されていますが、もう1つ良い例を挙げたいと思います。

// some test type
struct Foo {
    bool b;
    int i;
};

// define a matcher if ==operator is not needed in production
MATCHER_P(EqFoo, other, "Equality matcher for type Foo") {
    return std::tie(arg.b, arg.i) == std::tie(other.b, other.i);
}

// example usage in your test
const Foo test_value {true, 42};
EXPECT_CALL(your_mock, YourMethod(EqFoo(test_value)));
1
Jordan