Как запустить JUnit Test весной Инъекции JBOSS JNDI-источники данных

70
7

У меня есть приложение весной с оракулом базы данных, работающим на JBOSS 7.1. Я хочу протестировать бобы уровня сервиса, просто запуская тест junit. В моем весеннем контексте я использую источник данных jndi следующим образом:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jboss/datasources/myDatasource" />
<property name="resourceRef" value="true"/>
</bean>

Когда я запускаю свой тест junit, который загружает тестовый тест весны, я получаю исключение, такое как:

java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [context.xml]: Invocation of init method failed; nested exception is 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
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)

Как я могу вставить исходный источник JNDI в свои тесты без изменения моего контекста в jboss?

спросил(а) 2020-03-25T19:08:13+03:00 6 месяцев, 1 неделя назад
1
Решение
98

В соответствии с этим сообщением или этим замечательным сообщением в блоге я нашел три способа решить мою проблему, просто создайте метод BeforeClass в вашем классе JUnitTest.

Я размещаю его для сообщества:

- Решение 1
Это решение требует каталины.jar и oracledriver в вашем пути к классам:

@BeforeClass
public static void setUpClass() throws Exception {
try {
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");
InitialContext ic = new InitialContext();

ic.createSubcontext("jboss");
ic.createSubcontext("jboss/datasources");
ic.createSubcontext("jboss/datasources/myDatasource");

OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
ds.setURL("jdbc:oracle:thin:@xxxxx:1521:xxxxx");
ds.setUser("myUserid");
ds.setPassword("myPass");

ic.rebind("jboss/datasources/myDatasource", ds);
} catch (NamingException ex) {
ex.printStackTrace();
}
}

если вы используете maven, вы можете положить свой pom:

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>catalina</artifactId>
<version>6.0.37</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3.0</version>
<scope>test</scope>
</dependency>


- Решение 2
Это решение требует commons-dbcp в вашем пути к классам:

@BeforeClass
public static void setUpDataSource() throws Exception {
try {
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
DriverAdapterCPDS cpds = new DriverAdapterCPDS();
cpds.setDriver("oracle.jdbc.OracleDriver");
cpds.setUrl("jdbc:oracle:thin:@xxxxx:1521:xxxxx");
cpds.setUser("myUsername");
cpds.setPassword("myPass");

SharedPoolDataSource dataSource = new SharedPoolDataSource();
dataSource.setConnectionPoolDataSource(cpds);
dataSource.setMaxActive(10);
dataSource.setMaxWait(50);
builder.bind("jboss/datasources/myDatasource", dataSource);
builder.activate();
} catch (NamingException ex) {
ex.printStackTrace();
}
}

в вашем помпе:

<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>


- Решение 3
Это решение использует OracleConnectionPoolDataSource, входящий в состав Oracle Driver:

@BeforeClass
public static void setUpDataSource() throws Exception {
try {
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();

OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
ds.setURL("jdbc:oracle:thin:@xxxxx:1521:xxxxx");
ds.setUser("myUsername");
ds.setPassword("myPass");

builder.bind("jboss/datasources/myDatasource", ds);
builder.activate();
} catch (NamingException ex) {
ex.printStackTrace();
}
}

ответил(а) 2020-03-25T19:21:10.803922+03:00 6 месяцев, 1 неделя назад
40

Моя рекомендация заключалась бы в разделении конфигурации инфраструктуры (DataSource, PlatformTransactionManager ,...) и использовании JNDI/JTA только при развертывании в WildFly и другой конфигурации для тестирования. Вы можете использовать условные компоненты Spring для этого или по-разному создать свой контекст приложения.

ответил(а) 2020-03-25T19:08:13+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема