0

Google テストを作成しました (Google Mock を使用)。関連するコードは次のとおりです。

MockObj * obj = new MockObj ();
MockDI * mock_di = new DI();
MockDIPtr mock_di_ptr(mock_di); // boost shared ptr
Data data; // sort of on array
data.append(1); data.append(2); // Add two entries
EXPECT_CALL(*obj, get_di_ptr()).WillOnce(Return(mock_di_ptr));
EXPECT_CALL(*mock_di_ptr, get_data(_,_)).WillOnce(SetArgReferee<1>(data));
EXPECT_CALL(*obj , enqueue(_)).Times(2);

実際の実装は次のとおりです。

di_ptr->get_data(int, data); // data is updated via reference
for (int i = 0; i < data.size(); ++i)
{
    enqueue(data[i]);
}

基本的に、enqueue()データのエントリごとに 1 回呼び出す必要があります。また、モックは通常のモックです (Strict などではありません)。

このテストは、予想どおり、 をチェックすると合格しTimes(2)ます。

このテストは、予想どおり、Times(0)またはをチェックすると失敗しますTimes(1)

しかし、私がチェックすると、このテストは合格ですTimes(3)

なんで?その動作を検出するにはどうすればよいですか?

4

1 に答える 1

2

MockDI * mock_di = new DI();おそらくMockDI * mock_di = new MockDI();、行を機能させるために読む必要がありEXPECT_CALL(*mock_di_ptr, get_data(_,_)).WillOnce(SetArgReferee<1>(data));ます。

alegunaは良い点を指摘しました。次の簡単な実験では、エラーが発生しますActual function call count doesn't match EXPECT_CALL(mock, mockMe(_))...。テスト中のメソッドをデバッグし、後で確認することをお勧めしdata.size()ますdi_ptr->get_data()。次に、ブレークポイントを設定してData::append()、誰がさらに要素を追加するかを確認します。

#include "gtest\gtest.h"
#include "gmock\gmock.h"

using ::testing::_;

class Dependency
{
public:
    virtual ~Dependency() {}

    virtual void mockMe(int i);
};

void Dependency::mockMe(int i)
{
}


class MockDependency : public Dependency
{
public:
    MOCK_METHOD1(mockMe, void (int i));
};


class Cut
{
public:
    void testMe(Dependency& dependency);
};

void Cut::testMe(Dependency& dependency)
{
    for (int i=0; i<2; ++i)
    {
        dependency.mockMe(i);
    }
}


TEST(Experiment, VerifyExactCallCount)
{
    MockDependency mock = MockDependency();
    Cut cut;

    EXPECT_CALL(mock, mockMe(_)).Times(3);

    cut.testMe(mock);
}
于 2012-11-23T14:33:42.497 に答える