3

特定のクラス(FactoryProviders)を、単体テストで使用されているときに異なる動作をするように構成したいと思います。

public class ConnectionFactoryProvider {

    public static IConnectionFactory getConnectionFactory() {
        //return MockConnectionFactory if running in test mode and
        //DefaultConnectionFactory is running in production mode
    }

}

コードがテストモード(単体テスト)で実行されているか、本番モードで実行されているかに応じて、異なるConnectionFactoryを返す必要があります。

これを達成するための正しい方法は何ですか?いくつかの可能な解決策が思い浮かびます...しかし、それらのいずれかが広く採用されているイディオムですか?

  • 本番モードとテストモードで実行すると値が異なるように、JVM引数を介したシステムプロパティ。
  • 工場の完全修飾名をプロパティファイルに保持し、テストモードで実行するときに、ファイルシステムで別のプロパティファイルを使用できるようにします。これは、テストフェーズで実行するときにクラスパスの順序を制御できるため、Mavenで簡単に実行できますが、Eclipse内から単体テストを実行するときに達成できるかどうかはわかりません。
  • MockConnectionFactoryを返すように、テストセットアップメソッドでConnectionFactoryProviderを構成します
4

2 に答える 2

5

依存性注入 (DI)。ConnectionFactories は依存関係です。DI を使用すると、ConnectionFactory のインスタンスをコンストラクター パラメーターとして送信できます。このように、単体テストは MockConnectionFactory インスタンスを送信し、ライブ コードは DefaultConnectionFactory インスタンスを送信します。

public class ConnectionFactoryProvider {
    public static IConnectionFactory getConnectionFactory(IConnectionFactory connectionFactory) {
    //use the connectionFactory
    }
}

//unit test
ConnectionFactoryProvider cfp = new ConnectionFactoryProvider(aMockConnectionFactoryInstance);

//live code
ConnectionFactoryProvider cfp = new ConnectionFactoryProvider(aDefaultConnectionFactoryInstance);

それが役立つことを願っています。

PS 私は C# 開発者ですが、構文は Java でもほぼ同じだと思います。

于 2012-05-31T13:04:38.760 に答える
1

コード アプリケーションでは、次の 2 つのアプローチを使用します。

  1. 記号名を含むことができるシステム プロパティを読み取ります。本番環境では、デフォルトが使用されます。シンボリック名は、名前の意味を説明する構成ファイルにマップされます。

    そうすれば、必要な数の構成ファイルを持つことができ、実行時に構成を追加できます (バグを追跡するために本番環境でより多くのログを有効にするためにコードを変更する必要はありません)。

    例: システム プロパティの名前は ですdb.config。記号名はh2, it, prod(デフォルト) です。設定ファイルはオンになっています${configPath}/db-${db.config}.xml

  2. プロパティに基づいて構成を読み取りますuser.name。これにより、各開発者に独自の構成を簡単に与えることができます。その名前の構成ファイルがない場合、デフォルトの構成が読み取られます (または、デフォルトが常に読み取られ、オプションのユーザーごとの構成とマージされます)。

于 2012-05-31T13:58:52.633 に答える