まず、私はScalaを使用していますが、どのJavaアプローチでも機能します。(理解しやすいように、例としてJavaコードを使用します。)
私がConnection
インターフェースとその実装RealConnection
を持っているとしましょうFakeConnection
。
アプリケーションにリリースエントリとテストエントリの2つのエントリが必要です。通常どおりにアプリケーションをコーディングし、リリースバージョンが使用するすべてのクラスを使用するテストを開始しますが、のFakeConnection
代わりに使用する1つの例外がありRealConnection
ます。
私のアプリケーションは、を介して接続にアクセスしますConnection.get()
。
私が望まないのは次のようなものです:
public static Connection get() {
if ( isReleaseVersion )
return new RealConnection();
return new FakeConnection();
}
この種のコードによってアプリケーションコードが汚染されないようにしたいと思います。
可能なことは、次のようにConfig
オブジェクトを持つことです。
public static Connection get() {
return Config.getConnectionFactory().get();
}
ここでの問題は、Config
テストするたびにクラスを変更する必要があることです。他に存在しない場合は、おそらくこの方法を使用します。
私が使いたくないのはセッターです。final
変数や関数を扱いたい!次のようなものではありません:
public class TestEntry {
public static void main(String... args) }
Config.connectionFactory = new FakeConnectionFactory();
Config.databaseConnection = new FakeDatabaseConnection(); // Singleton, no factory needed.
MyApplication.start(args); // the ReleaseEntry is somewhere else!
}
}
私も使いたくないのはですGuice
。テストを行うたびに、モジュールを再定義する必要があります。また、Scalaでは一般的に使用したくありません。
Reflection
可能性はありますが、エラーは実行時にのみ表示されるため、それほどではありません。
私が望むことを達成するための代替手段はありますか?
私は道に行かなければなりませConfig
んか?
よろしく。