2010-12-21 13 views
1

次のvoidメソッドがあり、JUnitテストでテストする方法がわかりません。JavaテストJUnit(void)を使用したメソッド

public void removeFriend(String rf) 
{ 
    boolean found = false; 
    int i = 0; 

    while(i < friendList.size() && !found) 
    { 
     if(friendList.get(i).equals(rf)) 
     { 
      found = true; 
     } 
     else{ 
      i++; 
     } 
    } 

    friendList.remove(i); 
} 
+0

友達を削除しますか?クラスの残りの部分はどのように見えるのですか? – OrangeDog

答えて

2

おそらくfriendListは、メソッドが定義されたクラスのフィールドです。テストにそう

  1. クラスのインスタンスを作成し、一致している必要があります文字列とfriendList
  2. コールremoveFriendを取り込みます。
  3. friendListに友人が含まれていないと主張します。

おそらく、リストにない友人のStringを渡して、リストが変更されていないことを確認することもできます。

編集:あなたがコメントで提起した興味深い質問。私は通常、物事のこれらの種類と非常に明示していますので、私は、私はいくつかのものを残しているが、それは一般的な概要である

List<String> friendList = new ArrayList<String>(); 
friendList.add("friend1"); 
friendList.add("friend2"); 

// assert before actually calling the method under test to make sure my setup is ok 
assertEquals(2, friendList.size()); 

// theObj is an instance of the class you are testing 
theObj.friendList = friendList; 

// call the method under test 
theObj.removeFriend("friend1"); 

// be explicit, the list should now have size1 and NOT contain the removed friend 
assertEquals(1, friendList.size()); 
assertFalse(friendList.contains("friend1"); 

注意をするでしょう。リストにない文字列を削除する場合をテストできることを忘れないでください。また、同じ友人が2回リストに入っているケースをテストすることもできます。

+0

これはassertEqualsで行う必要がありますか?アサルトをどのように埋め込むのかは分かりません。 – Mael

+0

@私は私の答えを編集しました。 – hvgotcodes

0

このオブジェクトが何であれ、友人を追加して、そこにいると主張します。 removeFriend()を呼び出して、削除したものがそこにないと主張します。

1

あなたのクラスには複数の方法があると仮定します。このメソッドを呼び出す前後で動作をテストするには、これらの他のメソッドを使用する必要があります。ところで

:あなたの方法

  • は一致が見つからない場合は、最初のエントリを削除するように見えます。これは意図されていますか?
  • は、エントリがなければ爆発するでしょう。
  • friendListのいずれかのエントリがnullの場合、爆発するでしょう。
  • friendList.remove(rf)と同じことを行います。

私はこれらのすべての条件のテストを書いています。

重要なことは、動作する可能性のある状況ではなく、メソッドが破損する可能性があるすべての条件です。

4

まず、メソッド全体をfriendList.remove(rf);に置き換えることができますか? 正確にメソッド名が主張するものです(既に徹底的にテストされていることが保証されています)。

"純粋な"単体テストのもっともドグマチックな支持者でさえ、OO言語の各クラスのメソッドを完全に分離してテスト可能でなければならないと主張していません。それ以外の場合は、OOコードをまったくテストすることができず、ユニットテストは関数型言語に限定されます。

したがって、テストでは、メソッドを含むクラスのオブジェクトを作成し、そのコンストラクタまたはセッタを使用して、メソッドが操作できる特定の状態にし、メソッドを呼び出してからテストします。オブジェクトは後で期待された状態にあります。より具体的に:

  • は、このエントリがもはや存在しないことのいずれかのエントリでfriendList
  • コールremoveFriend()
  • テストをいくつかのエントリを置くクラス
  • のオブジェクトを作成します
0

あなたは、 "契約によるプログラミング"スタイルのデザインを参考にして勉強しているかもしれません。これは "テスト駆動開発"(TDD)スタイルでうまくいきます。簡単に言えば、ミューテータメソッドは、アクセス可能な(パブリックおよびプロテクト)ゲッタメソッドによって返される値に関してのみ行うことを意味します。

関連する問題