2016-12-15 2 views
0

JUnitでテストする場合、初心者です。for-loops/Loopsのテスト方法はわかりません。私のコードでは、私がテストしなければならないfor-loopsのいくつかを見ることができます。私は主にtop5のリストメソッドとprintListOfResultsをテストしたいと思っています。どうすれば私のfor-loopsとarraylistをJavaのJUnitでテストするのですか

import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Set; 
/** 
* Write a description of class Discipline here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class Discipline 
{ 
    private String disciplineName; 
    private HashMap <EliteSwimmer, Result> eliteResults; 

    /** 
    * Constructor for objects of class Discipline. 
    * @param disciplineName The discipline name. 
    */ 
    public Discipline(String disciplineName) 
    { 
     this.disciplineName = disciplineName; 
     eliteResults = new HashMap<EliteSwimmer, Result>() ; 
    } 

    /** 
    * Get the value of disciplineName. 
    * @return the value of disciplineName. 
    */ 
    public String getDisciplineName() 
    { 
     return disciplineName; 
    } 

    /** 
    * Add the elite swimmer's best training result. 
    * @param elite The elite member. 
    * @param res The elite member's best training result. 
    */ 
    public void addEliteResults(EliteSwimmer elite, Result res) 
    { 
     if (res.getType() == 0) { 
      eliteResults.put(elite, res); 
     } 
     else { 
      System.out.println("Not a training result"); 
     } 
    } 

    /** 
    * Print a list with the elite swimmers' best training results. 
    */ 
    public void printListofResults() 
    { 
     Set set = eliteResults.entrySet(); 
     Iterator iterator = set.iterator(); 
     while(iterator.hasNext()) { 
      Map.Entry mentry = (Map.Entry)iterator.next(); 
      System.out.println("Elite Swimmer: "+ ((EliteSwimmer)mentry.getKey()).getName()); 
      System.out.println("Result: " + ((Result) mentry.getValue()).getTime()); 

     } 

    } 

    /** 
    * Print a list with the top 5 elite swimmers, based on their training results. 
    */ 
    public void Top5List() 
    { 
     Set<Entry<EliteSwimmer,Result>> set = eliteResults.entrySet(); 
     List<Entry<EliteSwimmer,Result>> list = new ArrayList<Entry<EliteSwimmer,Result>>(set); 
     Collections.sort(list, new Comparator<Map.Entry<EliteSwimmer,Result>>() 
      { 
       @Override 
       public int compare(Map.Entry<EliteSwimmer,Result> o1, Map.Entry<EliteSwimmer,Result> o2) 
       {   return Double.compare(o1.getValue().getTime(), o2.getValue().getTime()); } 
      }); 

     LinkedHashMap<EliteSwimmer,Result> sortedHashMap=new LinkedHashMap<EliteSwimmer,Result>(); 
     for (Map.Entry<EliteSwimmer,Result> entry: list) { 
      sortedHashMap.put(entry.getKey(), entry.getValue()); 
     } 
     int counter = 0; 
     for(Map.Entry<EliteSwimmer,Result> entry: list) 
     {counter ++; 
      System.out.println("Elite swimmer: " + entry.getKey().getName()+"  Result: " +entry.getValue().getTime()); 
      if (counter == 5) 
       break; 
     } 
    } 
} 
+0

私が 'printListofResults'メソッドをテストしようとすると、' println'呼び出しを 'Print'メソッドで' PrintString'クラスにリファクタリングして、その文字列を引数として取ります。次に、テストでは、私は 'PrintString'クラスを模擬し、スパイを使用してメソッドがセット内の各要素に対して1回呼び出されたことを確認します。 –

答えて

0

これをテストする最も簡単な方法は、印刷上の懸念とビジネス上の問題を区別することです。言い換えれば、上位5人のスイマーを見つけてメソッドシグニチャーの一部として戻し、そのメソッドが特定のシナリオで正しいスイマーを返すかどうかをテストするメソッドがあります。それらの印刷は別々に行うことができます - 潜在的に別のクラスによって完全に可能です。

単体テストの支持者は、コード化されたコードがよくなると主張します。混在した懸念事項はテストするのが難しいのに対し、単一の責任を持つコードはテストが簡単で、将来理解しやすく、維持し、進化させます。

0

あなたのコードをテストしたいと思っており、それは正しい方法です。しかし、現在の実装では、特定のアサーションを行うのは難しいです。なぜなら、あなたは関数Top5Listが多くのことを行うからです。 それをより小さな論理部分に分割し、それをテストします。例えば:

  1. リストsortSwimmers(一覧<>ソートされていない)
  2. EliteSwimmer getBestSwimmer(リストスイマー)
  3. ストリングformattedPrint(EliteSwimmerスイマー)
  4. ストリングformattedPrint(リストスイマー)

その後、単体テストを個別に行います。

はまた、一般的なアドバイスは、互いに横にテストやコーディングを実行しようと、 はその後、それがこのようなテストコードにハード終わるためにはるかに困難です。

関連する問題