2012-05-08 9 views
1

私は、データベーステーブルの現在の「処理期間」を検索する方法でサービスの統合テストを作成しようとしています。ただし、常にアクティブな処理期間であるとは限りません。したがって、このメソッドはnullを返す可能性があります(処理が発生しない週があります)。このメソッドのJUnitテストを記述したいと思いますが、常に値を返すわけではないので、テストをいつ実行するかによって異なる結果が得られます。テスト時間依存サービスメソッド

期間オブジェクトおよびサービスは、次のようになります。

public interface ProcessingPeriod { 
    int getSeqno(); 
    Date getStart(); 
    Date getEnd(); 
} 

public class PeriodService { 
    /* Look up the current period; if not currently in a period, return null */ 
    public ProcessingPeriod getCurrentPeriod() { /* execute a sql query */ } 

    /* Look up the current period; if not currently in a period, get the next upcoming period */ 
    public ProcessingPeriod getCurrentOrNextPeriod() { /* execute a sql query */ } 

    /* Look up the current period; if not currently in a period, get the most recent period */ 
    public ProcessingPeriod getCurrentOrPreviousPeriod() { /* execute a sql query */ } 
} 

PeriodServiceのインスタンスは、Springアプリケーションコンテキストによって管理され、私のJUnitテストは、テスト・コンテキストを構築し、するサービスオブジェクトを提供するために、SpringJUnit4ClassRunnerを使用していますテスト。私のJUnitテストは、現在のようになります。

@Test 
public void testGetCurrentPeriod() { 
    ProcessingPeriod period = service.getCurrentPeriod(); 
    if (period != null) { 
     Date now = new Date(); 
     assertThat(period.getStart(), lessThanOrEqualTo(now)); 
     assertThat(period.getEnd(), greaterThanOrEqualTo(now)); 
    } 
} 

しかし、テストは処理期間中に実行されていない場合、多くを助けるために起こっているように、それはいないようです。 getCurrentPeriodメソッドが実際にデータベースから適切な期間を取得していることを有意義にテストするにはどうすればよいですか?私はデータベースを嘲笑すべきですか?また、実際にSQLを有効にするためにデータベースに対してクエリを実行したいと思っていました。

+1

nullを返し書き込みコードが無いないと見なされていない理由の例を本番コードをリファクタリングする必要がありますように

が見えます。 ;-) –

+0

関連する可能性のある質問:http://stackoverflow.com/questions/9731526/how-to-test-a-feature-that-depends-on-date-events-happen、http://stackoverflow.com/質問/ 2284279 /現在の日付に依存するテストロジックの方法、http://stackoverflow.com/questions/5092017/junit-with-new-date – k3b

+0

いつもより良いテストを実行するサンプル・テスト・データを使用して、セットアップでテストを実行する前にテスト・データを作成し、テストを実行して、最後にそれらのレコードを削除します。 –

答えて

1

new Date()getCurrentTimeMillis()などではなく、私はいつも私が必要とするすべての時間関連のメソッドを含むタイムプロバイダを使用します。

interface TimeProvider { 
    Date getDate(); 
    int getCurrentQuarter(); 
    ... 
} 

生産の実装は明らかです。しかし、テストでは、必要なプロバイダを置くことができますので、テストで好きな時間を設定することができます。それは春とうまくいく。それはそれ自身の内部時計(スリープ、ロック、クォーツなど)を使用しないコードをテストする場合にのみ機能します。それはあなたの例に合っていますが

+0

ありがとう、これは可能かもしれません。現在のクエリではデータベースの現在の日時を使用していますが、これは組織全体の権限として扱うためです。 – matts

+0

dbの日付が必要な場合は、クエリをリファクタリングして日付をパラメータとして取得する必要があります – piotrek

関連する問題