1

読み取りと書き込みの両方を行うSocketオブジェクトを受け取るメソッドのクラスを単体テストしようとしています。私は疑問に思っています、これについて行くための最良の方法は何ですか?私はチームで働いており(これは大学のプロジェクトです)、この(java)クラスのみを担当しているため、コードを完全にリファクタリングすることは実際にはオプションではありません。

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

先ほど申し上げましたように、私は大学生なので、フォーラムの知恵から学ぶことを楽しみにしています。お時間を割いていただきありがとうございます。

4

3 に答える 3

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このようにして、単体テストをその依存関係から分離します。

于 2012-04-28T20:06:50.370 に答える
0

すべての良い提案、ありがとう! 問題は、オートグレーダーを壊さないように、与えられたインターフェイス/API を保持しなければならなかったことです。

代わりに、Socket クラスをサブクラス化し (サブクラスの Mocket を呼び出すことになりました)、getInputStream メソッドと getOutputStream メソッドをオーバーライドしました。これにより、メソッドに出入りするデータの流れを制御でき、テストには十分でした。

みんな、ありがとう!

于 2012-04-29T23:24:46.410 に答える
0

最初に次のようにソケット インターフェイスを宣言する必要があると思います。

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

その後、インターフェースを実装するクラスを作成します。このクラスには Socket が含まれます。

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

于 2012-04-28T20:12:03.317 に答える