1

私は通常、クラスの各属性を final として設定します (コンストラクター内で初期化される属性のみ)。ポイントは、テスト目的でオブジェクトのモックアップを実装していることです。このモックアップは、モックアップしているクラスを拡張し、このクラスにはいくつかの最終的な属性があります。したがって、Mockup オブジェクトのコンストラクター内で super() コンストラクターを呼び出す必要があります。ただし、通常のクラスのようにすべての属性を初期化したくないため、これはモックアップのユーティリティを壊します。super() を呼び出さずに Mockup コンストラクターを呼び出して、やりたいことをしたいと思います。

私の質問は: モックアップでクラス コンストラクターを呼び出さなければならない限り、属性を final として定義することは良い習慣ですか?

編集:いくつかのコードを追加します。この場合の問題は、私がシングルトンを使用していることです。これはテスト時に良い考えではないことを知っていますが、この場合は変更できません。したがって、私の意図は、モックアップでこのメソッドを呼び出すことではありません。

public class ReportsDataManager {

private final Map<String, List<String>> translations;

public ReportsDataManager() {
this.translations = GenericUtils.getTranslation();
}

}

4

4 に答える 4

3

属性をfinalとして宣言することは、それが可能な場合に非常に良い方法です。それは不変性を与えます-保証されたスレッドセーフ。それを壊してモックにするのは悪い考えです。デザインは、テストの利便性ではなく、ユーザーのニーズを満たす必要があります。

于 2013-02-27T10:59:19.330 に答える
2

クラスをモックしたい場合は、それにインターフェースを与えて、そのインターフェースをモックします。また、モックはスタブではありません。モックではなくスタブを作成しているようです。モックを作成したい場合は、インターフェイスのモックを生成するライブラリを選択してください。

于 2013-02-27T11:00:35.037 に答える
1

一般に、使用するプラクティスによってコードのテストがより困難になる場合、そのプラクティスはにおいがする可能性があります。

変数を設定して、達成したいことを正確に決定してくださいfinalprotected受け入れられますか?

于 2013-02-27T10:59:19.367 に答える
1

final標準的なリフレクションで制限を回避できます。あなたはモックアップのコンテキストにいるので、これはあまり問題にはならないと思います。マルチスレッドの問題に注意してください。JVM は、フィールドがfinalセマンティクスに準拠していると想定し、それを念頭に置いて最適化します。

于 2013-02-27T11:10:01.963 に答える