あなたが求めているのは、「テスト容易性の向上」ではなく、単にネットワーク経由で送信するコードを「テスト」することだと思います。
私の経験から、ネットワーク経由で送信されるものをテストする興味深いものは 2 つだけです。
- アプリケーションは正しいメッセージを送信していますか?
- このメッセージをネットワーク経由で送信できますか?
たとえば、アプリケーションが (アプリケーション レベルの) メッセージを別のサーバーに送信できるとします。次のようなインターフェイスを定義できます。
public interface MessagePort {
void Send(Message message, ServerName to);
}
ここで、Message はアプリケーションが送信するメッセージ、ServerName はアプリケーション レベルでメッセージのターゲットに名前を付ける方法を表すクラスです。簡単にするために、ServerName は、構成、DNS、またはその他によってサーバーのアドレスにマップできる単純な文字列にすることができます。選んで。
MockMessagePort を実装してメッセージを単純なリストに格納し、アプリケーションが実際に正しいメッセージを送信しているかどうかをテストできます。(質問1。)
その後、ループバックを使用して、ネットワークを介したメッセージの実際の送信を実装できます。この例については、ボブおじさんの「クラフトマン」の記事を読みたいと思うかもしれません。
http://www.objectmentor.com/resources/publishedArticles.html、トピック「職人」。TCP サーバーのテスト主導の実装は、シリーズのいくつかのエピソードから離れていますが、最初から読む必要があります。
さらに興味深い抽象化は、メッセージ宛先への「チャネル」の抽象化です。
public interface MessageChannel {
void Send(Message message);
}
実装が宛先について知っている場所。もちろん、この場合、宛先「ServerName」からチャネルを提供する別のオブジェクトがあります。
ネットワーク機能の抽象モデルが本当に必要な場合は、次のようにします。
- 2 つの異なるネットワーク ライブラリを検索してみてください。
- 各ライブラリを使用して、同じアプリを 2 回作成します。
- アプリを因数分解します。アプリケーション コードは同じである必要があり、ネットワーク部分は異なる必要があります。それらはインターフェイスによって分離されます。これはあなたが探しているインターフェースです。
しかし、正直なところ、それがあなたのアプリケーションに多くをもたらすとは思えません。