1

2つのクラスがあります。

class SomeClass
{
public:
    int SomeFunction()
    {
        return 5;
    }
};


class AnotherClass
{
public:
    int AnotherFunction(SomeClass obj)
    {
        return obj.SomeFunction();
    }
};

SomeClassのモッククラスを作成しました。

class MockSomeClass : public SomeClass
{
public:
    MOCK_METHOD0(SomeFunction, int());
};

ここで、単体テストで、AnotherClass.AnotherFunctionを呼び出すと、自分で選択した結果が得られるようにします。AnotherFunctionは、SomeClass.SomeFunction()の関数を使用します。私はSomeClassを嘲笑しました。そして、モックオブジェクトの関数がそれを呼び出すと10を返すように設定しました。しかし、単体テストを実行すると、5(元の関数)が返されます。私は何をすべきか。以下は私が書いた単体テストです。

[TestMethod]
    void TestMethod1()
    {
        MockSomeClass mock;
        int expected = 10;
        ON_CALL(mock, SomeFunction()).WillByDefault(Return(expected));
        AnotherClass realClass;
        int actual = realClass.AnotherFunction(mock);           
        Assert::AreEqual(expected, actual);
    };

VisualStudio2008とgmock1.6.0を使用しています。私がしているのは何が悪いのか。realClass.AnotherFunctionでmock.SomeFunction()からのモック出力が必要です。

4

1 に答える 1

3

問題は、 SomeClass::SomeFunction(...) が仮想ではないことです。仮想にすると機能します。

アップデート:

失敗の原因となるもう 1 つの基本的なエラーがあります。それは、のメソッド シグネチャです。

int AnotherFunction(SomeClass obj)

これにより、新しい SomeClass オブジェクト インスタンスが作成され、それによって通常の SomeFunction が呼び出されます。代わりに、モック化されたクラスへの参照を引数として渡す必要があります。

int AnotherFunction(SomeClass* obj)

を使用して呼び出します

int actual = realClass.AnotherFunction(&mock);
于 2012-02-09T12:42:42.853 に答える