2

私は現在、JRE 1.4 (Java ランタイム環境) のみを使用するように制限されており、現在の時刻を計算するクラスがあります。クラスを単体テストしようとしていますが、私が遭遇したすべてのモッキング ツールは JRE1.4 でサポートされていない注釈を必要とするため、かなり難しいようです。

JRE 1.4 に適したバージョンの mockito を使用してみましたが、静的クラスをモックアウトすることはできません。Jmockitには、ダウンロードできる非常に簡単なソリューションがありますが、JmockitのJRE1.4対応バージョンはないようです

JRE1.5以降を使用していた場合、これを回避する方法は2つあります(現在の時刻を呼び出すメソッドをモックアウトするか、現在のシステム時刻をモックアウトするだけです)が、残念ながらそうではありません。

これに対する唯一の解決策は、現在のシステム時刻を +/- 日/月/年でメソッドに渡すことです。

ただし、可能であれば、JRE 1.4 環境でモックの方法で実行したいと考えています。

ありがとう

4

5 に答える 5

2

Java 5 をテストコードだけに使用しないのはなぜですか? 適切な IDE を使用すると、テスト コード (Java 5+) と製品コード (Java 1.4) 用に個別のモジュール/プロジェクトを使用できるはずです。

于 2011-08-28T15:25:51.050 に答える
1

Zsolt の解決策 (ラッパーの作成) の他に、メソッドへの呼び出しを抽出し、そのメソッドをオーバーライドするサブクラスに対してテストすることも考えられます。

テストするコード:

class A{
    protected long now(){
        return System.currentTimeMillis();
    }
}

単体テスト:

class ATest{
    public void testStuff(){
        // actual test
    }

    class MyA extends A {
        long currentTime;

        protected long now(){
            return currentTime;
        }
    }
}

私はラッパー アプローチを好みますが、サブクラス化が役立つ場合もあります。

于 2011-08-23T20:32:45.013 に答える
0

静的メソッドを扱うときは、ラッパーを使用することをお勧めします。たとえば、あなたの場合、TimeWrapper を使用できます。

public class TimeWrapper() {
    public long getCurrentTimeInMillis() {
        return System.currentTimeMillis();
    }
}

TimeWrapper他のクラスで現在の時刻を取得する必要がある場合は、を挿入します。このソリューションは、モック フレームワークと jdk に依存しません。

于 2011-03-10T06:44:11.537 に答える
0

または、DateHelper のようなすべての時間関連のメソッドに特別なクラスを使用してから、UnitTests でこれをモックし、静的変数を介して時間を変更できます。

于 2011-03-10T08:32:47.683 に答える
0

easymockはアノテーションを必要としないため、1.4 で動作します。

于 2011-03-10T08:18:38.437 に答える