2

サーバーがイベントソースからメッセージを取得し、イベントタイプに応じて接続ユーザーに通知を送信するJavaでソケットアプリケーションを作成しています。

今、私はサーバー用のいくつかの JUnit テストを作成しようとしています... JUnit (Eclipse では自動的に提案されます) は、すべてのパブリック メソッドのテストを実装し、その必要性を理解しています。サーバークラスにはパブリックメソッド bufferEvent... がありますが、イベントはプライベートメソッドで処理され、バッファされたメッセージの数を返すメソッドさえありません。

そのため、サーバーには結果を検証するパブリック メソッドがありません。

問題は一般化できると思います: public メソッドで結果を検証できない場合 (getter がないなど)、public メソッドをテストするにはどうすればよいですか?

テストのためだけに追加のメソッドを作成することは避けたいです。それらをテストするための回避策またはベストプラクティスはありますか?

前もって感謝します

4

3 に答える 3

2

コラボレーターのためにモックまたはスパイを挿入できるコンストラクターを作成する必要があります。

たとえば、サーバーにはコンストラクターがありますServer(List<Buffer> buffer)。テストのみに使用されます。次に、単体テストにバッファーを追加し、そのバッファーに変更が加えられたことをアサートできます。

リストは、テストで作成したオブジェクトに簡単に置き換えることができます。より高度なものが必要な場合は、 Mockitoのようなモック フレームワークをご覧ください。

たとえば、ソケットのモックを作成します。あなたは得るでしょうSocket = mock(Socket.class。コンストラクターに挿入しServer(List<Buffer> buffer, Socket socket)ます。次に、テストする関数を呼び出した後、たとえば、サーバーがパラメーター「yourMessage」をverify(socket).send("yourMessage")使用してメソッドを使用したかどうかを確認して、動作を確認できます。send

たとえば、このPluginsクラスはコンストラクターにいくつかのプラグインを必要とします。そのモックをテストするには、次のようにこのテスト クラスでverify(proxyServerPlugin).proxyServer(config);作成、挿入、および検証を行います。

他の例については、 Mockitoを参照してください。

于 2013-03-27T14:02:26.723 に答える
1

ネガティブ テスト ケースを確認できます。サービスからの戻りはありませんが、サービスによってスローされる例外がある可能性があります。

@Test
public void testServerService(){
try{
   myServer.service();
   Assert.assertTrue(true);
}catch(Exception ex){
   Assert.fail("anything goes wrong");
}
}

それ以外の場合は、次のように書きます。

@Test
public void testServerService(){
   myServer.service();
   Assert.assertTrue(true);
}

したがって、プロセスが問題なく実行されるかどうかを確認するために、少なくともアサーションがあります。

ところで私はあなたが正しいと思います。Junit テストケースを検証するためだけに新しい機能を作成することは、非常に悪い習慣です。

于 2013-03-27T13:19:35.653 に答える
0

独自の Level TEST を使用して Logger を追加し、メソッドの最後に重要な値を記録し、A testclass へのストリームを持つことについてどう思いますか。

于 2013-03-28T13:16:34.430 に答える