2017-08-21 14 views
1

"デザイン"のアドバイスが必要です。私は静的なJDBCオブジェクトと他のクラスで共有されている "メインエントリクラス"を持っています。異なるクラス間でオブジェクトを共有する

MainClassは、次のようになります。

public static Jdbc db1; 
public static Jdbc db2; 

connectDb(makeDirectConnection) // depending on runtime passed argument 

public static connectDb(boolean makeDirectConnection) { 
if(makeDirectConnection) // use direct connection 
    db1 = JdbcFactory.getInstance("db/config/main/db1.properties"); 
    db2 = JdbcFactory.getInstance("db/config/main/db2.properties"); 
} else { // connect using via SSH tunnel (different host and port) 
    db1 = JdbcFactory.getInstance("db/config/tunnel/db1.properties"); 
    db2 = JdbcFactory.getInstance("db/config/tunnel/db2.properties"); 
} 

JdbcFactoryは、インスタンスのMapを維持します。

それはちょっとOK動作しますが、私はdb1またはdb2は、ユニットテストから私はMainClass.dbConnect()

をしない場合、私は、nullポインタ例外を取得する使用されているクラスのためのユニットテストを作りたい場合は事を悪化させる - から

Main.db1 = JdbcFactory.getInstance("db/config/test/db1.properties"); 

をすべて一緒に、それは厄介だと私は好きではない:Test.classから私がやるように、テストクラスは、私は、一つでも多くの異なるDBのセットアップを必要とします。 db1db2をどうやって共有するのがいいですか? Javaの実行引数から定義される。またboolean makeDirectConnection

finaldb1db2を使用してから私を停止します。どのようにこれを回避するためのアドバイス? (プログラムが実行される環境に依存しますが、ホスト名や他のOSのものに依存したくないのですが)。

+0

あなたはそれらの接続が含まれています(セッターのようなすなわち無ミューテータメソッド)不変オブジェクトを使用することができます。

DB1=db/config/test/db1.properties DB2=db/config/test/db2.properties 

を次の使用しています。そのオブジェクトは、メインクラスまたはテストによって呼び出すことができるファクトリオブジェクトまたはメソッドによって作成されます。その後、必要に応じてそのオブジェクトを渡します。 – Thomas

答えて

1

デフォルトのインスタンスを別々に設定する必要があるためどのようなファイルを使用してdb1db2のデフォルトインスタンスを作成する必要があるのか​​を説明するproperty fileを作成してください。

ToユニットテストコードからMainClass.dbConnect()を呼び出す必要がなくなりました。スタティックブロックを作成してください。ここでは、db1db2をデフォルトで初期化しています。例えばプロパティファイルがdefaultDB.propertiesで、以下の内容を持つ場合:

static private Properties prop; 
static { 
    prop = new Properties(); 
    prop.load(new FileInputStream("defaultDB.properties")); 
    db1 = JdbcFactory.getInstance(prop.getProperty("DB1")); 
    db2 = JdbcFactory.getInstance(prop.getProperty("DB2")); 
} 
1

私はあなたの2つの間で異なったjvm引数としてブール値を指定しません)ケースの代わりに、私はdb urlをパラメーターで提供します。その場合、 "test-db.properties"を使ってテスト内でメソッドを呼び出すこともできます。

関連する問題