0

我已经使用此链接在 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?如何做到这一点?

4

2 回答 2

0

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

无需依赖 JNDI 来执行您的测试:这不是您想要测试的,相反,您只想验证您的实际代码是否正确运行。

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

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

于 2013-03-11T08:33:35.673 回答
0

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

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

然后你可以像往常一样查找数据源

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

可以在此处找到有关 TomcatJNDI 的更多信息。

于 2017-11-05T11:46:58.530 回答