2012-04-28 8 views
1

私は、両方とも読み書きするSocketオブジェクトを取るメソッドのクラスを単体テストしようとしています。私は、これについて行くための最善の方法は何ですか?私はチーム(これは大学のプロジェクトです)で働いており、この(Java)クラスのみを担当しているので、コードを完全にリファクタリングすることは実際の選択肢ではありません。ベストプラクティス:Socketを引数として取り込むメソッドをユニットテストしますか?

「モケット」などのモックソケットはありますか?どのようにこの問題にアプローチしますか?

私が言及したように、私は大学生ですから、フォーラムの知恵から学ぶのを楽しみにしています。答える時間をとっていただきありがとうございます。

+1

はい、ソケットを模擬してください。 –

+0

MДΓБДLL、どうすればいいですか?リンクを投稿してもよろしいですか? – Plastech

答えて

2

コードをテスト可能にするには、Socketに依存するクラスは、ソケットの抽象化(例えば、読み書きのような使用するメソッドを公開する単純なインタフェース)に依存する必要があります。あなたのアプリケーションは実際のSocketクラスのラッパーを使用しますが、単体テストではモックを使用することができます(これにはJMockをチェックしてください)。

は考えてみましょう:

public interface ISocket 
{ 
    byte[] read(); 
    int write(byte[] content); 
} 

public class SocketWrapper : ISocket 
{ 
    // read and write methods simply delegate work to real socket 
} 

public class ClassToTest 
{ 
    private ISocket socket; 

    public ClassToTest(ISocket socket) 
    { 
     this.socket = socket; 
    } 
} 

は、今すぐあなたのユニットテストであなたはISocketのモックを作成することができますし、ClassToTestコンストラクタに渡します。このようにして、単体テストをその依存関係から分離します。

+0

+1しかし、私の意見では、インターフェイスはクライアントであり、ソケットではなく、このコードでより抽象化しているはずです。 – AlexTheo

0

私はあなたが最初のようにソケットインターフェイスを宣言する必要があると思う:インタフェースを実装するクラスを作成した後

public interface IClient{ 
bool connect(...); 
bool disconnect(...); 
bool sendData(...); 
} 

。このクラスにはSocketが含まれます。

コードをテストする必要があるクラスでは、具体的な実装ではなくクライアントのインターフェイスを渡します。このようにして: 1)あなたのテストしたクラスを変更せずにシステムの動作を交換することができます。 2)必要な実装でクライアントをモックすることができるので、ソケットを引数として使用するよりも簡単にコードをテストします。

0

良い提案、ありがとうございます!問題は、私が与えられたインターフェース/ APIを保存しなければならないことであり、それはオートグラベーターを壊さないためです。

私だけではなく、Socketクラスをサブクラス化することだったやった(私は私のサブクラスMocketを呼び出して終わるんでした)、その後のgetInputStreamおよびgetOutputStreamのメソッドをオーバーライドします。これにより、メソッドの内外におけるデータの流れを制御することができ、テストには十分でした。

ありがとうございます!

+0

このアプローチを使用すると、テストコードで実際の 'Socket 'を使って依存関係を作成することが終了しました。テストで使用するために作成された 'Mocket'クラスは、' Socket'クラスでdependeします。これはあなたのコードではありません。 あなたのコードをテスト実行すると、あなたが境界を維持する必要があり、そしてあなただけのコードをテストを保証し、誰も他人のコード。 @jimmy_keenは良い答えでした。 –

関連する問題