1

データベーステーブルで現在の「処理期間」を検索するメソッドを使用して、サービスの統合テストを作成しようとしています。ただし、アクティブな処理期間が常に存在するとは限らないため、メソッドは null を返す場合があります (処理が行われない週もあります)。このメソッドの JUnit テストを書きたいのですが、常に値が返されるとは限らないため、テストをいつ実行するかによって異なる結果が得られます。

period オブジェクトとサービスは次のようになります。

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 */ }
}

のインスタンスはPeriodServiceSpring アプリケーション コンテキストによって管理され、私の 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 が有効であることを確認するために、データベースに対して実際にクエリを実行したいと考えていました。

4

1 に答える 1

1

new Date()などをコードで使用する代わりに、getCurrentTimeMillis()必要なすべての時間関連メソッドを含む時間プロバイダーを常に使用します。

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

プロダクションの実装は明らかです。ただし、テストの場合は、必要なプロバイダーを配置できるため、テストでいつでも好きな時間を設定できます。スプリングによく合います。ただし、独自の内部クロック (スリープ、ロック、クオーツなど) を使用しないコードをテストする場合にのみ機能します。

あなたの例に合っているように見えますが、本番コードをリファクタリングする必要があります

于 2012-05-10T12:03:21.547 に答える