Значения свойств JNDI Spring Boot 2.0 не загружаются из файла свойств теста приложения

Я пытаюсь запустить тестовые примеры и свойства jndi, настроенные в файле application-test.properties

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { App.class }, webEnvironment = WebEnvironment.RANDOM_PORT)
@ContextConfiguration
@TestPropertySource("classpath:/application-test.properties")
public class CheckingServiceTest {

Конфигурация в файле свойств

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=remote://xyz:4447,remote://xyz:4447
java.naming.security.principal=qaappmq
java.naming.security.credentials=xyz123
jms.username=qaappmq
jms.password=ixyz123
jboss.naming.client.ejb.context=true

В файле конфигурации Xml

<bean id="JNDITemplate" class="org.springframework.jndi.JndiTemplate">
        <constructor-arg name="environment">
            <props>
                <prop key="java.naming.factory.initial">${java.naming.factory.initial}</prop>
                <prop key="java.naming.provider.url">${java.naming.provider.url}</prop>
                <prop key="java.naming.security.principal">${java.naming.security.principal}</prop>
                <prop key="java.naming.security.credentials">${java.naming.security.credentials}</prop>
                <prop key="jboss.naming.client.ejb.context">${jboss.naming.client.ejb.context}</prop>
            </props>
        </constructor-arg>
    </bean>

Во время выполнения тестового примера он бросает

Caused by: java.lang.ClassNotFoundException: ${java.naming.factory.initial}
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:61)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:672)
    ... 92 common frames omitted

Пробовал напрямую помещать статическое значение в инициализацию bean-компонента, он работает нормально, и даже приложение работает нормально с конфигурацией по умолчанию, указанной в application.properties.

Проблема: значение свойств не инициализируется в файле конфигурации XML.


person Kumar Panchal    schedule 11.10.2018    source источник
comment
Что именно вы собираетесь делать? Если вы хотите использовать в тесте одни и те же основные свойства приложения, вам не нужно никаких изменений (как вы заметили в посте). Какая польза от xml? Вы пытаетесь добавить / переопределить свойства только для тестирования?   -  person s7vr    schedule 22.10.2018
comment
Я хочу инициализировать значение свойства в файле xml из файла свойств   -  person Kumar Panchal    schedule 23.10.2018
comment
У вас уже есть файл недвижимости. Зачем инициализировать и использовать xml? Если вам нужны тестовые свойства, используйте свойство application-test. Извините, я не понимаю ваше требование.   -  person s7vr    schedule 23.10.2018
comment
Я использую файл application-test.properties. на самом деле проблема только с инициализацией этого свойства JNDI, а другие свойства загружаются нормально.   -  person Kumar Panchal    schedule 23.10.2018
comment
не могли бы вы привести мне пример   -  person Kumar Panchal    schedule 23.10.2018
comment
остальные все свойства успешно инициализируются в обоих случаях во время работы и тестирования. но при тестировании только этих свойств не инициализируется только свойство JNDI   -  person Kumar Panchal    schedule 23.10.2018
comment
дорогой, мне нужно значение ключа свойства из значения свойства   -  person Kumar Panchal    schedule 23.10.2018
comment
Можете ли вы добавить в пост класс application-test.properties и App?   -  person s7vr    schedule 23.10.2018
comment
Аннотация @TestPropertySource пытается загрузить файл свойств, относящийся к классу, объявившему аннотацию. Попробуйте переместить свои тестовые свойства в пакет тестового класса и удалить classpath: / из значения аннотации. Кстати: используя аннотацию таким образом, вы можете определить свойства в тесте, если вы хотите / нуждаетесь в нем: @TestPropertySource (properties = {foo.bar = baz, java.naming.security.credentials = xyz123})   -  person ibexit    schedule 26.10.2018
comment
Вы нашли решение проблемы?   -  person mihomir    schedule 21.03.2019
comment
Да, из моего проекта удалена конфигурация XML и созданы все необходимые bean-компоненты с использованием аннотаций.   -  person Kumar Panchal    schedule 25.03.2019


Ответы (3)


Добавьте @ActiveProfiles("test") в свой тестовый класс

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { App.class }, webEnvironment = WebEnvironment.RANDOM_PORT)
@ContextConfiguration
@TestPropertySource("classpath:/application-test.properties")
@ActiveProfiles("test")
public class CheckingServiceTest {
person Federico Piazza    schedule 26.10.2018
comment
Уже пробовал это как решение, но конкретное свойство только не инициализировано. Инициализируются другие свойства XML. - person Kumar Panchal; 29.10.2018
comment
Попробуйте удалить аннотации @ContextConfiguration и @TestPropertySource и classes = { App.class } - person Federico Piazza; 29.10.2018

Попробуйте изменить аннотацию TestPropertySource на:

@TestPropertySource(locations = "classpath:application-test.properties")

person Fabio Manzano    schedule 26.10.2018
comment
Уже упоминался этот код, и эта аннотация будет использоваться для инициализации значений, которые аннотируются аннотацией @Value. - person Kumar Panchal; 29.10.2018

Удалите конфигурацию XML из проекта и попробуйте создать управляемую аннотацию каждого bean-компонента.

Присвоить значение каждой переменной с помощью @Value или создать отдельный класс с помощью

 @Configuration
 public class TestConfiguration {

@Bean(name = "publishJNDITemplate")
public JndiTemplate publishJNDITemplate() {
    final Properties environment = new Properties();
    environment.put(Context.INITIAL_CONTEXT_FACTORY, factoryIntial);
    environment.put(Context.PROVIDER_URL, providerUrl);
    environment.put(Context.SECURITY_PRINCIPAL, securityPrincipal);
    environment.put(Context.SECURITY_CREDENTIALS, securityCredentials);
    environment.put(narfeedTopics, destination);
    return new JndiTemplate(environment);
}

}

person Kumar Panchal    schedule 25.03.2019