1

Google Mockを使用してモックを作成してテストXyz::xyz_funcするために、次のコードを作成しました。Abc::abc_func

#include <iostream>
#include "gmock/gmock.h"
#include "gtest/gtest.h"

using namespace std;
using ::testing::_;
using ::testing::Return;

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

        virtual bool abc_func(int arg)  = 0;
};

class MockAbc : public Abc
{
    public:
        virtual ~MockAbc() { }

        MOCK_METHOD1(abc_func,  bool(int arg));
};

class AbcImpl : public Abc
{
    public:
        virtual bool abc_func(int arg)
        {
            cout << arg << " :: " << __FILE__ << " :: " << __LINE__ << endl;
            return true;
        }
};

class Xyz : public AbcImpl
{
    public:
        virtual ~Xyz() {}
        virtual bool xyz_func()
        {
            AbcImpl obj;
            return obj.abc_func(1);
        }
};

TEST(AbcTest, func_success)
{
    MockAbc *mock = new MockAbc();

    EXPECT_CALL(*mock,  abc_func(_)).WillOnce(Return(true));

    Xyz test;

    EXPECT_TRUE(test.xyz_func());

    delete mock;
}

int main(int argc, char** argv)
{
    ::testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

しかし、私は以下のエラーを受け取ります。実際の実装ではなく、abc_funcのモックを呼び出すようにXyzクラスに指示する方法を知りたいです。手伝っていただけませんか。

1 :: ./gmock_test.cpp :: 30
./gmock_test.cpp:50: Failure
Actual function call count doesn't match EXPECT_CALL(*mock, abc_func(_))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
4

1 に答える 1

2

タイプのモックオブジェクトを作成してMockAbcいますが、それを使用することはありません。コードから、作成したインスタンスが、で明示的に作成しMockAbcたオブジェクトを自動的に置き換えることを期待しているようです。AbcImplXyz::xyz_func

代わりに行う必要があるのは、依存性逆転を使用して、によって使用されるオブジェクトxyz_funcを実行時に指定できるようにすることです。

またはXyzから継承する必要はありません。AbcImplAbc


2つの潜在的な解決策:

class Xyz {
public:
    explicit Xyz(Abc& obj) : 
        obj(&) {
    }

    virtual bool xyz_func() {
        return obj->abc_func(1);
    }
private:
    Abc* obj;
};

また

class Xyz {
public:
    virtual bool xyz_func(Abc& obj) {
        return obj->abc_func(1);
    }
};
于 2012-08-21T15:36:12.480 に答える