Программно установить InitialContext для модульного теста
Я использую Resource
тег в кота context.xml
файл для хранения информации о соединении с базой данных. Я получаю к нему доступ в моем сервлете джерси, как это:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup(DB_SOURCE_CONTEXT);
return ds.getConnection();
Для модульного тестирования я использую jersey-test и grizzly2, а не развертывание на tomcat. Я пытаюсь установить свойства соединения для использования тестовой БД (в настоящее время MySQL, но я изменю ее на DBUnit далее) в классе модульного теста:
@BeforeClass
public static void initializeTest() throws NamingException
{
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setUrl(TEST_DB_URL);
dataSource.setMaxTotal(10);
dataSource.setMaxIdle(5);
dataSource.setInitialSize(5);
dataSource.setValidationQuery("SELECT 1");
envContext.bind(DB_SOURCE_CONTEXT, dataSource);
}
Но я получаю следующее исключение, так что это явно не правильный способ сделать это:
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
Как я могу установить эти значения, чтобы код считывания контекста в сервлете считывал тестовые значения?
1 ответ
У меня была похожая проблема при использовании glassfish и создании контекста для тестирования.
Вам нужно предоставить некоторые свойства для InitialContext, чтобы он мог строить себя правильно.
Например:
Hashtable<String, String> props = new Hashtable<>();
props.put("java.naming.factory.initial","com.sun.enterprise.naming.impl.SerialInitContextFactory");
props.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.put("java.naming.factory.state","com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
InitialContext ctx = new InitialContext(props);
Надеюсь это поможет.