2013-03-11 68 views
0

我在tomcat中配置了MysqlDataSource,使用這個link。我寫了junit測試用例。當我從junit下面調用連接時,它會拋出以下錯誤。如何在java中連接junit和tomcat?

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 

我用下面的代碼

class DataConnection { 
    private static DataSource dataSource; 

public DataConnection() { 
    try { 
     Context ctx = new InitialContext(); 
     dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/test"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
} 

public static Connection getConnection() throws SQLException { 
    new DataConnection(); 
     Connection con=dataSource.getConnection(); 
     return con; 
} 
} 

如何從JUnit的調用tomcat的?如何實現這一目標?

+0

你有沒有考慮寫一個小的shell或Windows批處理腳本調用Tomcat容器?你的JUnit代碼可以在'setUp()'中調用這個腳本。 – asgs 2013-03-11 07:43:56

+1

可能是[如何啓動和停止一個tomcat容器與java](http://stackoverflow.com/questions/2190300/how-to-start-and-stop -an-Tomcat的容器與-java的) – asgs 2013-03-11 07:52:05

回答

0

您給出的代碼從JNDI獲取數據庫連接,例如,當從容器中運行tomcat時。但是,對於單元測試(假設這就是你使用JUnit的目的),我寧願建議使用「依賴注入」 - 例如明確地將數據庫連接傳遞給測試中的代碼或在測試運行之前手動設置它。

有沒有必要依靠JNDI來執行測試:這不是你想要測試的,而是想驗證你的實際代碼是否正確運行。

您不需要任何花哨的庫(例如spring)來進行依賴注入,只需稍微調整一下架構即可。這將大大提高應用程序的可測試性,並縮短測試的執行時間。

(這是基於你在你的問題給出的信息一點根據我的你的情況的假設)

0

TomcatJNDI一試。它基於嵌入式Tomcat,但僅初始化Tomcat的JNDI環境,而不啓動服務器。因此,您可以在測試中或從任何Java SE應用程序中訪問Tomcat配置文件中配置的所有資源。該API很簡單。例如,爲了得到一個數據源中context.xml中宣稱:

TomcatJNDI tomcatJNDI = new TomcatJNDI(); 
tomcatJNDI.processContextXml(contextXmlFile); 
tomcatJNDI.start(); 

然後,你可以查找數據源和往常一樣

DataSource ds = (DataSource) InitialContext.doLookup("java:comp/env/path/to/datasource") 

More information about TomcatJNDI can be found here.