2

アプリケーションの構成を取得するファクトリ クラスがあります。

public class ConfigurationFactory {
private static ConfigurationFactory configurationFactory = new ConfigurationFactory();

private Configuration configuration = null;

public static ConfigurationFactory getConfigurationFactory() {
        return configurationFactory;
    }

そして、構成をどこから取得しているかに応じたいくつかの getConfiguration メソッド (ファイル、データベース、デフォルトなど...):

public Configuration getConfiguration(String path){...}
public Configuration getConfiguration(String database){...}

私の問題は、各メソッドの単体テストを行うときに、別のソースからロードするためにシングルトンを再起動する必要があることです。そのため、思いついたのはこれを追加することだけです:

public void resetConfiguration() {
 this.configuration = null;
}

そして、私はそれを行うために開発者の地獄で燃え尽きる気がします:)

私の質問:このメソッドを追加せずに他の方法はありますか?

注: 私はこれを見ましたが、Spring や Guice のような DI フレームワークは使用できません。管理者は、このプログラムはサーバー上でデーモンとして実行することを目的としているため、フレームワークを追加するとプロジェクトが重くなると考えています。

4

4 に答える 4

1

最初に修正すべきことは、シングルトンが静的であってはならないということです。その方法を示すいくつかの記事を次に示します。

これを修正すると、シングルトンを自由に注入できるようになるため、シングルトンをリセットする必要がなくなります。

于 2012-05-10T04:06:10.307 に答える
1

私が考えることができるもののいくつかは

  1. Easymockまたはのようなモック フレームワークを使用してMockitoをモックし、ConfigurationFactoryこのモック オブジェクトを他の呼び出し領域で使用します。

  2. クラスでセッターを定義し、次のConfigurationFactoryようなアノテーションを定義し、@TestPurposeこれを使用して単体テストからシングルトン オブジェクトをオーバーライドします。注釈は、これがアプリケーション フロー中に使用されるべきではなく、関数が junit の目的のみを意味することを示すことです。

于 2012-05-09T06:51:36.900 に答える
0

提案されたフレームワークを使用したくない場合でも、'src' と 'test-src' を分割して、パブリック メソッドの代わりに保護されたメソッドを使用できます。それは理想的ではありませんが、テストを可能にしながらそのリセットメソッドの呼び出しを防ぎます。

  • src/main/myproject.myfactory.ConfigurationFactory
  • src/test/myproject.myfactory.TestConfigurationFactory

-> JUnit クラスで @After または @AfterClass メソッドを使用してリセットを呼び出します

複数のテストシナリオ全体でファクトリが必要な場合は、そのようなシングルトンを消去する @AfterClass メソッドを含む抽象 BaseTest クラスを作成することもできます。

また、テストコードでリフレクションによってリセットを強制し、余分なリセット方法をまったく使用しないこともできますが、それはお勧めしません。

于 2014-05-05T09:14:44.847 に答える