2017-08-21 2 views
1

Ich brauche einige "Design" beraten. Ich habe statische JDBC-Objekte und meine "Haupteintragsklasse", die unter anderen Klassen geteilt werden.teilen Objekt über verschiedene Klassen

Mein MainClass sieht wie folgt aus:

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 hält Map von Instanzen.

Es funktioniert irgendwie in Ordnung, aber wenn ich will für die Klassen Unit-Test machen, wo db1 oder db2 verwendet wird I Null-Zeiger-Ausnahme, wenn von Unit-Test ich nicht MainClass.dbConnect()

Make Sache noch schlimmer machen - von Testklassen ich brauche auch noch eine andere DB-Setup, so von Test.class ich tun:

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

Alle zusammen, es ist chaotisch und ich weiß nicht wie. Gibt es keinen schöneren Ansatz, wie man db1 und db2 teilt?

Auch boolean makeDirectConnection, die von Java-Lauf Argument definiert ist, hält von mir finaldb1 und db2 verwenden. Irgendein Rat, wie man das umgeht? (Es hängt von der Umgebung ab, in der das Programm ausgeführt wird - aber ich möchte es nicht vom Hostnamen oder anderen OS-Dingen abhängig machen.

+0

Sie könnten eine unveränderliche (das heißt keine Mutatormethoden wie Setter) Objekt verwenden, das diese Verbindungen enthält. Dieses Objekt könnte von einem Factory-Objekt oder einer Factory erstellt werden, die von Ihrer Hauptklasse oder Ihrem Test aufgerufen werden können. Dann übergeben Sie das Objekt nach Bedarf. – Thomas

Antwort

1

Da müssen Sie die Standardinstanz diffrently für festlegen Testen und Bereitstellen: Erstellen Sie eine property file, die angibt, welche Datei zum Erstellen der Standardinstanz für db1 und db2 verwendet werden soll Entfernen Sie die Notwendigkeit, MainClass.dbConnect() aus Ihrem Komponententestcode aufzurufen, erstellen Sie einfach einen statischen Block und initialisieren Sie hier db1 und db2 mit Standard. z.B. Wenn Eigenschaftendatei defaultDB.properties und mit folgendem Inhalt:

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

dann folgende verwenden:

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

Ich würde keinen booleschen Wert als jvm-Argument bereitstellen, um zwischen Ihren beiden (oder dreien) zu unterscheiden) Fälle, stattdessen würde ich die db-URLs via Parameter bereitstellen.In diesem Fall können Sie auch Ihre Methode innerhalb Ihres Tests mit der "test-db.properties" aufrufen.

Verwandte Themen