3

私は の新規ユーザーgmockです。gmockこのクラスを他のクラスのクラスメンバーとしてインスタンス化するために使用する方法がわかりません。コードは次のようになります。

classs B
{
    B_fun();
};
class A
{
    B b;
    A_fun()
    {
    if( b.B_fun() === XXX )
    {
     doXXXXX...
    }
}

今、私はgmockモックにB使用mockBしてから、Aの UnitTest で使用したいと考えています。やり方を教えてください。ありがとう!

4

2 に答える 2

2

クラス B を次のようにモックできます。

class MockB: public class B
{
    MockMethod0(B_func, void())
};

次に使用します。

MockB mockb;

そして、クラス A の構築関数の 1 つが次のとおりであるとします。

A(B b_)b(b_){}

したがって、次の方法でモック関数を実行可能にすることができます。

A test_a = A(mockb);
EXPECT_CALL(...)
于 2012-09-23T16:01:00.330 に答える
1

Factoryメソッドを使用できます(これはfactoryパターンとは異なります)。

あなたの場合、コード例は次のとおりです。

class B
{
    B_fun();
};

class A
{

    A()
    {
        b = CreateB();
    }

    A_fun()
    {
        if( b->B_fun() === XXX )
        {
           doXXXXX...
        }
    }

    private:

    virtual B* CreateB()
    {
        return new B();
    }

    B* b;
}

したがって、ここに仮想の CreateB メソッドがあります。

次に、MockA クラスを作成し、このメソッド (CreateB) のみをモックします。

モック メソッドは MockB クラス インスタンスを返す必要があります。これは、MockB インスタンスを返すようにテスト フィクスチャでモック メソッド (CreateB) を設定することで実行できます。

必要に応じて、MockB インスタンスに期待を寄せます。

実際には:

class MockA : public A
{
public:
    virtual ~MockA() {}
    MOCK_METHOD1(CreateB, B*());
};

TEST_F(TestA, TestSomething)
{
    MockB* b(new MockB()); // mock that will be used
    MockA  a;                // class under test, factory method(s) mocked
    // setup mocks
    EXPECT_CALL( a, CreateB()).Times(Exactly(1)).WillOnce(Return(b));

    EXPECT_CALL(*b, SomeMethod()).Times(Exactly(1));

    // execute test
    a.A_fun(3u);
 }
于 2015-09-03T08:45:25.720 に答える