如何在java中连接junit和tomcat?

时间:2013-03-11 07:25:56

标签: java mysql tomcat

我已经使用这个link在tomcat中配置了MysqlDataSource。我已经编写了junit测试用例。当我从junit调用下面的连接时,它会抛出以下错误。

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?怎么做到这一点?

2 个答案:

答案 0 :(得分:0)

您提供的代码从JNDI获取数据库连接,例如从容器中运行tomcat时。但是,对于单元测试(假设你使用的是JUnit),我宁愿建议使用“依赖注入” - 例如显式地将数据库连接传递给测试中的代码,或者在测试运行之前手动设置它。

没有必要依赖JNDI来执行测试:这不是您想要测试的,而是要验证您的实际代码是否正确运行。

您不需要任何花哨的库(例如spring)来进行依赖注入,只需稍微调整一下架构。这将大大增强应用程序的可测试性并缩短测试的执行时间。

(这是基于我根据您在问题中提供的一些信息对您的情况做出的假设)

答案 1 :(得分:0)

尝试TomcatJNDI。它基于嵌入式Tomcat,但只在不启动服务器的情况下初始化Tomcat的JNDI环境。因此,您可以在测试中的Tomcat配置文件中或从任何Java SE应用程序中访问所有资源。 API很简单。例如,获取在context.xml中声明的DataSource:

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.