3

モックしたいすべてのプロパティアクセサーを仮想化する必要はありませんか?

つまり、オブジェクトを変更して、モックしたいすべてのアクセサーを仮想化する必要がある場合、クラスを継承して自分でモックすることはできませんか?

4

1 に答える 1

3

あなたの質問は非常に有効ですが、考えてみると、クラスをモックする方法は他にありません。インターフェイスを使用する場合、それは単なるコントラクトであるため、モック フレームワークは好きなようにモックできますが、クラスを使用する場合は、そのメンバーの実装が既にあります。

したがって、モック フレームワークは、クラス メンバーをモックできるようにするために、クラスから継承し、要求に応じてメンバーの動作をオーバーライドする必要があります。この目的のためには、仮想メンバーのみが機能します。

たとえば。あなたが持っている場合(私はメソッドを示していますが、同じことがプロパティにも当てはまります)

class Foo
{
    public void Bar()
    {

    }
    public virtual void  virtualBar()
    {

    }
}

モックフレームワークはおそらくこのようなものを作成してモックします

public class MockFoo : Foo
{
    public override void virtualBar()
    {
        // mockery action
    }

    public new void Bar()
    {
        // mockery action
    }
}

今、あなたが持っているとき

Foo foo = GetMockObject(); // you get an instance of MockFoo

今あなたが電話するとき

foo.Bar();

実際の実装を呼び出すつもりはありませんが、非仮想メンバーであるため、のを呼び出しFooますBar()

一方、呼び出し

foo.VirtualBar();

は、要求に応じてモック フレームワークによって動作が注入される仮想メンバーであるため、を呼び出しますMockFooVirtualBar()

于 2011-05-04T02:00:14.760 に答える