1

私のプログラムには、目覚まし時計のイベントに似た日課があります。たとえば、午後 2 時 (時間は、私の PC のシステム時間です) になったら、何かしてください。

私がやりたいのは、テスト期間をスピードアップすることです(私は、毎日のルーチンを見てエラーをチェックするのに4日間待ちたくありません. とても嬉しかったのですが、まだやり方がわかりません。

私は Mock Object を初めて使用し、Java でプログラミングしています。したがって、JMock または EasyMock (または類似のもの) は私には問題ないかもしれません。

ありがとう

4

4 に答える 4

4

現在の時刻を取得する必要がある場合は、システム クロックを直接使用しないでください。次のようなインターフェイスを使用してください。

public interface Clock
{
    long currentMillis();
}

次に、本番用のシステム クロックを使用してこれを実装し、テスト用にフェイクを渡すことができます。そこでは、フェイクを任意の時間に設定できます。

ただし、システムを駆動しているものをモックアウトする必要もあります。特定の時間を明示的に待機していますか、それとも他の何かがコードを呼び出していますか?

于 2009-07-17T13:49:37.083 に答える
1

Java について質問されたので、お詫びしなければなりません。Java に関してはランチに出かけますが、1 つの解決策は、DateTime オブジェクトをモックして、目的の時間に設定することです。

.NET では、次のようになります。

public static class SystemTime
{
    public static Func<DateTime> Now = () => DateTime.Now;
}

SystemTime.Now = () => new DateTime(2000,1,1);

From:テストでの時間の扱い


... 特定の時刻にベルを鳴らす目覚まし時計プログラムは、現在の時刻を外界から取得する可能性があります。これをテストするには、ベルが正しく鳴ったかどうかを知るために、アラーム時刻まで待機する必要があります。実際のオブジェクトの代わりにモック オブジェクトを使用すると、ベルが鳴る時刻 (実際にその時刻であるかどうかにかかわらず) を提供するようにプログラムできるため、目覚まし時計プログラムを単独でテストできます。

あなたが参照しているこの目覚まし時計は、オブジェクトをモックする例を示しています。実際には、モック フレームワークから使用できるオブジェクトではありません。

于 2009-07-17T13:46:58.303 に答える
0

基本的に、テストで行うことは、時計のイベントを偽造することです。正確には、デザインとイベントの待機方法によって多少異なりますが、単純にするために(純粋ではない場合)、タイムイベントがトリガーされたときに呼び出されるメソッドを用意して、両側をテストするのが私のアプローチです。その。

1つ目は、メソッドの呼び出しをテストし、時限イベントが期待どおりに機能することを確認することです。次に、そのクラスをモックします(JMockを使用する場合は、そのクラスをインターフェースにして、呼び出し元のメソッドにそのインターフェースを実装させることをお勧めします)。

次に、タイミングを処理するクラスにモックを渡します。ここでも、スレッド化/トリガーの問題(システムクロックのチェックやスレッドの開始など)を抽象化し、モックにイベントをすぐに実行する値を返すようにします。

次に、実際にシステムクロックを読み取り、スレッドを開始する実際のコードを可能な限り小さくします。これは、単体テストの対象外の領域になります。

于 2009-07-17T13:52:37.220 に答える
0

モッキングは単体テストに関連しています。あなたが説明している機能については、トリガー(あなたの場合は目覚まし時計イベント)をプロセス(あなたの「日課」が何をしていても)から分離し、プロセス機能を単体テストします。

次に、プロセス機能を呼び出すスケジューリング コードに注意を向けます。これにはQuartzのようなものを使用することをお勧めしますが、自分でロールアップする場合は、システムクロックの現在の値に基づいてトリガー時間を割り当てれば、実際のシステムクロックで単体テストを実行できます。トリガーイベントが発生することをテストします。

于 2009-07-17T15:00:56.880 に答える