我已经使用这个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?怎么做到这一点?
答案 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")