1

ユニットテスト可能な(Moqを使用した)抽象化を提供しようとする際に、抽象化の作成方法に応じてConcurrentQueue<T>、フレームワークの実装を使用する利点が失われるかどうかについて議論しています。ConcurrentQueue<T>

次のコードリストでどちらか一方を実行することの意味は何ですか。

public abstract class MyMessageQueue1<T> : ConcurrentQueue<T>
{
    public new virtual void Enqueue(T item)
    {
        base.Enqueue(item);
    }
}

public class MyMessageQueue2<T>
{
    private readonly ConcurrentQueue<T> _concurrentQueue = 
        new ConcurrentQueue<T>();

    public virtual void Enqueue(T item)
    {
        _concurrentQueue.Enqueue(item);
    }
}

最初の実装(MyMessageQueue1)では、呼び出しを基本クラスに渡す前に、実装を提供するために基本クラスのメソッドを非表示にします。

2番目の実装では、内部をラップし、ConcurrentQueue<T>必要に応じて呼び出しを渡します。

並行性を手動で処理する必要がありますかMyMessageQueue2、またはすべての呼び出しがラップされたに渡されるため、問題ではありませんConcurrentQueue<T>

4

2 に答える 2

2

@nandaで述べられているように、ConcurrentQueueへの呼び出しを委任するだけなので、どちらの場合も同時実行を処理する必要はありません。ただし、このクラスをラップする理由を知るのに役立ちます。ファイルやデータベースなどの外部リソースを使用しないという意味で、ユニットテストにかなり適しています。クラスで使用する場合は、そのままにして、ConcurrentQueueを使用する独自の機能をテストすることができます。

メソッドが目的の方法で使用しているかどうかを確認したいためにラップしようとしている場合は、メソッドの動作ではなく、メソッドの実装のテストに焦点を当てている可能性があります。これは特定のシナリオで役立つ場合がありますが、その事実に注意する必要があり、一般的な方法ではありません。

このようなラッパーを作成するときに失うものが1つあります。ラッパーにはモックできる仮想メソッドがあるため、メソッドをインライン化できず、パフォーマンスが少し低下します。ConcurrentQueueはスリムで高速なクラスであり、これは実際には問題になる可能性があります。

于 2012-11-05T10:43:46.937 に答える
1

ラッパーが行うのはConcurrentQueueへの委任だけであり、ラッパーに同時アクセスを保護するための独自のメンバーがない場合、ラッパーの同時実行については何もする必要はありません。

しかし、この薄いラッパーでユニットテストを行うにはどうすればよいでしょうか。

于 2012-11-02T12:04:20.327 に答える