3

私は小さなクラスを持っています:

struct Command
{
    uint8_t cmdId;
    uint8_t len;
    uint8_t payload[MAX_PAYLOAD];
};

そして、googlemock の期待値を使用して、ペイロードの最初の 2 つの要素のみを検証したいと考えています。ペイロードの長さと期待値が同じであることを確認するため、ElementsAreArray は使用できません。これまでのところ、次のような期待があります。

Command cmd;
cmd.cmdId = 0xD3;
cmd.len = 2;
cmd.payload[0] = 'm';
cmd.payload[1] = 'l';

EXPECT_CALL(mockQueue,
        sendFromIsr(Pointee(AllOf(
                Field(&Command::cmdId, Eq(0xD3)),
                Field(&Command::len, Eq(2)),
                //Field(&BirdCommand::payload, ElementsAreArray(cmd.payload, 2)) !<-- Doesn't work
        ))))
        .WillOnce(Return(true));

何か案は?モッククラスは次のようになります。

template <typename T>
class MockQueue : public Queue<T>
{
public:
    MOCK_METHOD1_T(sendFromIsr, bool(T &item));
};
4

3 に答える 3

2

これの何が問題なのですか:

EXPECT_CALL( mockQueue, sendFromIsr( Ref( cmd ) )
        .WillOnce( Return( true ) );

?

コマンドは POD であるため、コマンドをコピーしても機能するはずです (この場合は機能しません)。


編集

コマンドはPODであるため、ゼロ初期化する必要があります(または、作成時にそのようなオブジェクトが占有するメモリをクリアします。例では:

Command cmd = Command();

その後、オブジェクトは初期化されず、比較は失敗しません。

于 2011-02-25T13:48:40.117 に答える
2

私は googlemock メーリング リストを介して Piotr Gorak からこの解決策を受け取りました。議論はこちらです。

MATCHER_P2(CheckFirstTwo, first, second, "Checks the first two elements of an array")
{
    return arg[0] == first && arg[1] == second;
}

テストでは、次のように確認します。

EXPECT_CALL(mockQueue, sendFromIsr(
        Pointee(AllOf(
            Field(&BirdCommand::cmdId, Eq(0xD3)),
            Field(&BirdCommand::len, Eq(2)),
            Field(&BirdCommand::payload, CheckFirstTwo('m', 'l'))
        ))
));

テストを過剰に指定したり、製品コードのデータ構造を不必要にゼロ初期化したりする必要がないため、このソリューションが最も気に入っています。

于 2011-02-28T09:09:04.290 に答える
-1

やってみました

EXPECT_CALL(mockQueue,
        sendFromIsr(Pointee(AllOf(
                Field(&Command::cmdId, Eq(0xD3)),
                Field(&Command::len, Eq(2)),
                Field(&Command::payload[0], Eq('m')),
                Field(&Command::payload[1], Eq('l'))
        ))))
        .WillOnce(Return(true));
于 2011-02-25T14:40:30.693 に答える