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 final
db1
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.
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