Я только что настроил заполнитель свойства в своей конфигурации 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
и без префикса classpath все не работает. Абсолютный путь с префиксом файла работает, но это не очень хорошее решение.
Есть ли способ заставить свойство-заполнитель работать с тестами? Одно решение, которое я уже нашел, - переопределить местоположение, предоставив свойства по умолчанию в 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 Config, содержащий аннотацию @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 также содержит определение bean-компонента для класса WebServiceConfig. Однако Spring не может найти компонент, определенный в Java Config. Поэтому мне пришлось добавить WebServiceConfig.class в ContextConfiguration тестового класса.