我需要一些" design"建议。我有静态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
个实例。
它有点可行,但是如果我想对正在使用db1
或db2
的类进行单元测试,如果从单元测试我不做{我得到空指针异常{1}}
让事情变得更糟 - 从测试类我甚至需要一个不同的数据库设置,所以从MainClass.dbConnect()
我做:
Test.class
所有这一切都很混乱,我不喜欢。如何分享Main.db1 = JdbcFactory.getInstance("db/config/test/db1.properties");
和db1
,是不是有更好的方法?
从java run参数定义的db2
也阻止我使用boolean makeDirectConnection
final
和db1
。任何建议如何解决这个问题? (这取决于程序执行的环境 - 但我不想让它可靠的主机名或其他操作系统的东西。
答案 0 :(得分:1)
我不会提供一个布尔值作为jvm参数来区分你的两个(或三个)情况。相反,我会通过参数提供数据库网址。在这种情况下,您还可以使用“test-db.properties”在测试中调用您的方法。
答案 1 :(得分:1)
由于您需要为测试和部署而不同地设置默认实例。因此,请创建一个property file,其中提到应使用哪个文件为db1
和db2
创建默认实例。
要从单元测试代码中删除调用MainClass.dbConnect()
的需要,只需创建一个静态块,然后使用默认值初始化db1
和db2
。例如如果属性文件为defaultDB.properties
且具有以下内容:
DB1=db/config/test/db1.properties
DB2=db/config/test/db2.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"));
}