gpt4 book ai didi

java - Junit 在应用服务器外测试 JNDI InitialContext

转载 作者:IT老高 更新时间:2023-10-28 20:59:00 48 4
gpt4 key购买 nike

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 数据源连接的代码

最佳答案

这里要做的正统做法是更改您的代码,以便将 Context 注入(inject)其中(通过依赖注入(inject)框架或手动)。然后,您只需在单元测试中传递一个模拟。

如果您不能这样做,并且您的代码必须自己创建 IntialContext,那么您将需要设置一个可以注入(inject)模拟的假 JNDI 实现。如果您在网上搜索 in-memory JNDI implementationmock JNDI implementation ,您会找到各种选项,或者您可以自己编写一个。基本上,您将需要一个 InitialContextFactory 的实现,它只返回一个合适的模拟,然后您可以通过设置 java.naming.factory.initial 系统属性来选择它。

我擅长编写必要的类(class)。给你:

public class MockInitialContextFactory implements InitialContextFactory {

private static final ThreadLocal<Context> currentContext = new ThreadLocal<Context>();

@Override
public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
return currentContext.get();
}

public static void setCurrentContext(Context context) {
currentContext.set(context);
}

public static void clearCurrentContext() {
currentContext.remove();
}

}

public class MockInitialContextRule implements TestRule {

private final Context context;

public MockInitialContextRule(Context context) {
this.context = context;
}

@Override
public Statement apply(final Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, MockInitialContextFactory.class.getName());
MockInitialContextFactory.setCurrentContext(context);
try {
base.evaluate();
} finally {
System.clearProperty(Context.INITIAL_CONTEXT_FACTORY);
MockInitialContextFactory.clearCurrentContext();
}
}
};
}
}

如下使用:

public class FooTest {

private final Context context = mock(Context.class);

@Rule
public MockInitialContextRule mockInitialContextRule = new MockInitialContextRule(context);

@Test
public void testName() throws Exception {
// set up stubbings on the context mock
// invoke the code under test
}
}

关于java - Junit 在应用服务器外测试 JNDI InitialContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17083142/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com