Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/multiDS");
connection = dataSource.getConnection();
请帮我模拟一下上面的代码。
嗨,汤姆·安德森
我尝试了下面的代码
@BeforeClass
public static void setUpClass() throws Exception {
// rcarver - setup the jndi context and the datasource
try {
// Create initial context
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES,
"org.apache.naming");
Context ic = new InitialContext();
ic.createSubcontext("java:");
ic.createSubcontext("java:comp");
ic.createSubcontext("java:comp/env");
ic.createSubcontext("java:comp/env/jdbc");
ic.createSubcontext("java:comp/env/jdbc/multiDS");
// Construct DataSource
OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
ds.setURL("jdbc:oracle:thin:@g9u0696.houston.hp.com:1525:CRNAD");
ds.setUser("uname");
ds.setPassword("pwd");
} catch (NamingException ex) {
ex.printStackTrace();
}
}
但其施误为:
com.hp.corona.common.exception.CacheException: org.apache.naming.NamingContext cannot be cast to javax.sql.DataSource
请帮助我测试代码,我只想从JNDI数据源连接
4条答案
按热度按时间ukqbszuj1#
这里要做的正统的事情是修改代码,以便将
Context
注入其中(通过依赖注入框架,或者手动)。然后,您只需在单元测试中传递一个mock。如果你不能做到这一点,你的代码必须创建
IntialContext
本身,那么你将需要设置一个假的JNDI实现,你可以在其中注入模拟。如果你在网上搜索in-memory JNDI implementation或mock JNDI implementation,你会发现各种各样的选项,或者你可以自己编写一个。基本上,你将需要一个InitialContextFactory
的实现,它只返回一个合适的模拟。然后可以通过设置java.naming.factory.initial
系统属性来选择它。我在写必要的类时有一个裂缝。给你:
使用方法如下:
dhxwm5r42#
你可以使用Spring实现,它的工作方式如下:
v1l68za43#
使用Simple-JNDI可以轻松完成此操作。在工作目录中创建一个属性文件“jdbc/multiDS.properties“,以使用以下属性配置数据源:
然后使用以下命令示例化上下文
之后你可以打电话
有关Simple-JNDI的更多信息,请单击此处https://github.com/h-thurow/Simple-JNDI
polkgigr4#
我在一个要添加测试的遗留系统上使用建议的解决方案时遇到了问题,但我发现使用Mockito.mockConstruction是一种简单的方法: