Заполнитель свойства Spring не работает с тестами jUnit

Я только что настроил заполнитель свойства в своей конфигурации Spring.

<context:property-placeholder location="classpath:/config/config.properties" />

Если я запускаю приложение с этой конфигурацией, все работает нормально. Однако, если я попытаюсь запустить модульные тесты, тест не сможет загрузить ApplicationContext из-за ошибки FileNotFoundException. Это происходит, если я пытаюсь запустить тесты из Eclipse, а также при запуске теста через maven.

Я также пытался настроить PropertyPlaceholderConfigurer напрямую с тем же результатом.

Кажется, что файл не находится в пути к классам, хотя тестовые классы аннотированы

 @ContextConfiguration("classpath:/config/spring-config.xml")

файлы находятся в одной папке, и он находит конфигурацию xml.

Я уже пробовал использовать разные пути: classpath:config/config.properties и без префикса пути к классам, все не работает. Абсолютный путь с префиксом файла работает, но это не очень хорошее решение.

Есть ли способ заставить свойство-заполнитель работать с тестами? Одно решение, которое я уже нашел, состоит в том, чтобы переопределить местоположение, предоставив свойства по умолчанию в файле xml. Есть ли другое решение? Или я один с этой проблемой?

Мои тестовые классы выглядят примерно так:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/config/spring-config.xml")
@Transactional
public class JpaImageDaoTest {
@Autowired
private ImageDataDao imageDataDao;

@Test
public void testFindById() {

    Image anImage = new Image();
    anImage.setData(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 });

    imageDao.save(anImage);
    Image image = imageDao.findById(imageData.getId());

    assertNotNull(image);
    assertEquals(anImage, image);
}

и контекст xml выглядит так:

 <context:property-placeholder location="classpath:/config/config.properties" />

 <bean id="imageScalingService" class="service.image.ImageScalingService">
    <property name="maxWidth" value="${scaling.thumbnail.maxWidth}" />
    <property name="maxHeight" value="${scaling.thumbnail.maxHeight}" />
</bean>

Наконец-то я нашел решение/обходной путь

Похоже, Spring не любит смешивать XML и Java Config или, по крайней мере, в данном случае это не работает. Я тестировал это с 4.0.9.

Вместо использования XML-файла в моем @ContextConfiguration я сослался на класс конфигурации Java, который содержит аннотацию @PropertySource.

@Configuration
@PropertySource("test.properties")
@ImportResource("webservices.xml")
public class TestPlaceholderConfig {

}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestPlaceholderConfig.class, WebServiceConfig.class})
public class MyTest {
}

Странно то, что файл webservices.xml также содержит определение компонента для класса WebServiceConfig. Однако Spring не может найти bean-компонент, определенный в конфигурации Java. Таким образом, мне пришлось добавить WebServiceConfig.class в ContextConfiguration тестового класса.


person suicide    schedule 03.04.2011    source источник
comment
как насчет classpath*:config.properties?   -  person Adi Sembiring    schedule 04.04.2011
comment
Я использую propertyPlaceholder в тестах без проблем. Что-то должно быть упущено в вашем описании проблемы. Попробуйте включить ведение журнала INFO для org.springframework, он показывает загруженные файлы контекста и файлы свойств.   -  person mrembisz    schedule 04.04.2011
comment
Я пробовал classpath *, но это тоже не работает в тесте. Он просто устанавливает массив ресурсов с 0 ресурсов. Я также установил ведение журнала на отладку, и в нем не говорится, что он загружает файл свойств, как это происходит при запуске приложения.   -  person suicide    schedule 05.04.2011
comment
Можете ли вы показать мне фрагмент TestClass и файл контекста Spring?   -  person Adi Sembiring    schedule 05.04.2011
comment
@adisembiring Я обновил вопрос, надеюсь, этого достаточно   -  person suicide    schedule 06.04.2011
comment
@suicide тебе помогли с этим? я столкнулся с той же проблемой.   -  person kenthewala    schedule 21.09.2016
comment
@kenthewala извините, нет. Обычно я стараюсь избегать Spring в модульных тестах или использовать конфигурацию Java со значениями по умолчанию в классах конфигурации Java.   -  person suicide    schedule 23.09.2016
comment
Я обновил исходный вопрос своего рода решением   -  person suicide    schedule 30.12.2016


Ответы (2)


Я думаю, что если это проект maven, то файл свойств должен находиться в папке src/test/resource/config. Потому что при выполнении тестовых случаев путь к классам для тестов — src/test/resource/config. Попробуйте поместить файл конфигурации в путь к классу тестового примера.

person Vishal Akkalkote    schedule 12.05.2014

В какой папке находится config.properties? Если вы следуете стандартной структуре папок maven, она должна находиться в src/main/resources/config/config.properties.

person gkamal    schedule 04.04.2011