2011-08-15 7 views
1

私がテストするには、このメソッドを持っているとモックを初期化しますCstOrderBeanは、それがPOJO(いくつかの静的初期化など - ソースコードジェネレータからの)ではありませんので、Mockitoで嘲笑される必要がありは、どのように変数データ

public static Date getDateSinceUTC(CstOrderBean orderBean) { 

    int year = orderBean.getDeadLineYear(); 
    int month = orderBean.getDeadLineMonth(); 
    int day = orderBean.getDeadLineDay(); 
    int hour = orderBean.getDeadLineHour(); 
    int minute = orderBean.getDeadLineMinute(); 
    String ap = orderBean.getDeadLineAmPm() == 1 ? "PM" : "AM"; 

    //TODO AM=0, PM=1 comes from html form 
    SimpleDateFormat df = new SimpleDateFormat("yyyy:MM:dd:hh:mm:aa"); 
    String stringDate = stringifyIntegers(":", year, month, day, hour, minute); 
    stringDate = stringDate.concat(ap); 

    Date date; 
    try { 
     date = df.parse(stringDate); 
    } catch (ParseException e) { 
     throw new Error("Parsing date from html form failed", e); 
    } 
    return date; 
} 

。しかし、私はxxx回のメソッドを実行する必要があるので、多くのデータの組み合わせでモックを設定する

私はTestNGの@DataProviderを使ってそれを行うことができました。しかし、私はそれを行う方法がわかりません、私はそれを推測する:

when(ob.getDeadLineYear()).thenReturn(1, 2, 3); 
    .... 

ループでは、それは悪い考えではないですか? xxモックを作成してそのように初期化するには、これを行う正しい方法はありますか?

答えて

1

各テストでは、好ましくは可変データを持たない独自のモックを取得する必要があります。同じモックオブジェクトからいくつかの異なる戻り値を使用する場合、テスト中のメソッドの結果ではなく、模擬メソッドへの呼び出し回数とテストが結合されるため、テストはホワイトボックステストでなければなりません。あなたが繰り返しまたは

when(ob.getDeadLineYear()).thenReturn(someValue, anotherValue, ..., ultimateValue); 

あなたはおそらくその模擬値を制御する必要があり、これはきれいかもしれないが可変引数として戻り値を定義することでthenReturnを呼び出して、戻り値のセットを定義することができます、と述べた

とにかく戻ってくる。

+0

ホワイトボックステストで何を意味するのか分かりません。私はテストメソッドを渡すだろうと思ったこのような人口模様の人は "do then return(1、2、3 ... 100);" (1 ... 100) – lisak

+0

ホワイトボックステストとは、テスターがインプリメンテーションとインターフェイスにアクセスできる状況を指します。複数の結果を提供するモックオブジェクトがある場合は、実装では、モックされたメソッドが1回だけ呼び出されると想定していると思います。ただし、実装が変更され、メソッドが複数回呼び出されると、テスト中に破損します。この場合は、実装の変更(ホワイトボックス)を反映するようにテストを変更し、テストを反映するように実装を変更するか、両方を変更する必要があります。いずれにしても、インプリメンテーションの詳細はインターフェイスの外部にあります。 –

+0

私はあなたが意味するものを見ると、これは統合テストの問題になるでしょう、これは本当に1つのメソッドの機能テストです。ありがとうAleksi – lisak

0

あなたが模擬する方法は、テストしたいことによって異なります。締め切り年のルーピングはあなたが望む仕事をしないかもしれません。

when(ob.getDeadLineYear()).thenReturn(2000); 
when(ob.getDeadLineMonth()).thenReturn(2); 
when(ob.getDeadLineDay()).thenReturn(29); 
when(ob.getDeadLineHour()).thenReturn(12); 
when(ob.getDeadLineMinute()).thenReturn(0); 
when(ob.getDeadDeadLineAmPm()).thenReturn(1); 

assertTrue("Got unexpected date", getDateSinceUTC(ob).toString().startsWith("2000-02-29 12:00:00")); 

(警告:コードの上に手で入力した)うるう年の作品のようなものになる可能性がある場合はご覧に

一つのテスト。他の日付のmix、match、repeat は、getDateSinceUTCが動作していることを確認するためにテストする必要があります。 2/30/2012のような無効な日付をチェックする別のテストメソッドが必要な場合があります(スローが必要です)。あなたは23:61のような無効な時間をチェックしたいかもしれません。あなたの誕生日のような有効な日付をチェックしたいかもしれません。

年のループの代わりに、「通常の」ケース、境界線のケース、およびエラーケースを見てください。これは単体テストの方が優れています。

+0

ありがとうございましたrajah、これはMocksでのテストに関する一般的な質問でしたデータ)。時間のあるサンプルは単なる例でした。私は1つのインスタンスとthenReturn(1,2,3 ... 1000)を推測します。それを行う正しい方法です – lisak

関連する問題