1

私は静的メソッドクラスUtilsを持っています。これは基本的にユーティリティメソッド用で、ほとんどすべてのクラスで使用されます。ファイルやその他の基本的なものを取得するようなことをします。私のテスターは、このクラスをシングルトンに変更して、Utilsを使用するすべてのクラスがgetInstance()を呼び出す必要があるようにしました。その理由は、そうでない限り、彼は特定のことをテストできなかったからです。これはいくつかの点で間違っており、問題につながる可能性があるように思われます。

public class Utils {

/**
 * Singleton method to allow for easier testing.
 * @return an instance of
 */
public synchronized static Utils getInstance() {
    if (instance == null) {
        instance = new Utils();
    }
    return instance;
}

public synchronized static void setInstance(Utils instance) {
    Utils.instance = instance;
}

/** Singleton to make testing easier **/
private static Utils instance = null;

public static boolean checkOSTen() {
    return getInstance()._checkOSTen();
}

private boolean _checkOSTen() {
    boolean autoPair = false;
    if (android.os.Build.VERSION.SDK_INT >= 10){   
        autoPair = true;
    }
    return autoPair;
}

}

ちなみに、私は少なくとも7つのスレッドを使用してメッセージを送信する非常に複雑な内部メッセージングシステムを使用しており、静的メソッド呼び出しとシングルトン静的メソッド呼び出しの影響があるかどうかを確認したいと考えていました。

これ以外のテストを行う別の方法はありますか?いくつかのJavaリフレクションはあなたが必要とするものを手に入れるようです。

4

1 に答える 1

2

テスターは、の戻り値を簡単に変更できないため、このコードのテストが難しいと感じる可能性がandroid.os.Build.VERSION.SDK_INTあります。したがって、この戻り値に応じて使用されるさまざまなコードパスを簡単にテストすることはできません。インスタンスメソッドを使用することで、モックフレームワークを使用して、テスト対象に応じて、またはの_checkOSTenいずれかを返すようにメソッドを偽造できます。truefalse

テストを行う別の方法は、これらのような静的メソッドをまったく使用せず、代わりDeviceCapabilitiesに、OSのバージョンの知識を必要とする他のすべてのクラスにセッターまたはコンストラクターを介して注入されるクラス(おそらく呼ばれる)を使用することです。

次に、テスターは、DeviceCapabilitiesこの情報へのアクセスが必要なクラスのインスタンスを簡単に渡すことができます。

とはいえ、ビルドのこの段階では、このような変更を行うには遅すぎる可能性があるため、テスターが行った変更は妥当な妥協案です。

于 2012-06-28T15:25:59.463 に答える