2013-03-11 97 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.