Я только что настроил заполнитель свойства в своей конфигурации 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 тестового класса.