Использование ResourceLoader Spring в тестах



Я @Autowire включаю org.springframework.core.io.ResourceLoader в один из моих @Service классов.



Во время тестов я хотел бы получить доступ к экземпляру ResourceLoader, чтобы его можно было ввести в тестируемый сервис. Как лучше всего получить полностью функциональный экземпляр ResourceLoader во время тестов?



Если это невозможно, есть ли альтернатива ResourceLoader? По сути, мне нужно, чтобы мой сервис прочитал некоторые статические файлы из проекта.



Обновление :



Начал использовать @RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration на моем тесте; однако, ResourceLoader, который теперь вводится через @Autowire в мой сервис, ведет себя иначе, чем обычно (т. е. когда он не находится в контексте теста). В тесте ResourceLoader#getResource возвращает ресурс, указывающий на плохой относительный путь, а не правильный абсолютный путь, который появляется во время регулярного выполнения.



Некоторые дополнительные сведения, обнаруженные во время отладки:




  • во время тестов @Autowired resourceLoader является экземпляром org.springframework.context.support.GenericApplicationContext

  • во время регулярных исполнение, resourceLoader является экземпляром org.springframework.web.context.support.XmlWebApplicationContext

533   3  

3 ответов:

Какой тест вы хотите написать?

Если это модульный тест, то вам, вероятно, следует создать макет ResourceLoader и внедрить этот макет в экземпляр службы. (Например, используйте mockito)

Если это интеграционный тест, то лучше использовать фреймворк Spring TestContext. Создайте контекст spring, содержащий все компоненты, необходимые для теста, а затем аннотируйте тестовый класс с помощью @RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration, что позволит автоматически подключать полностью настроенные бобы (например, экземпляр службы, подлежащий тестированию) в тестовом классе.

Вы можете использовать DefaultResourceLoader. Он обрабатывает URL и classpath ресурсы, которых должно быть достаточно для простых тестов.

DefaultResourceLoader не нуждается в специальной настройке. Просто создайте новый экземпляр и передайте его в тест.

Я полагаю, что ваш service определен примерно так:

public class ResourceService {
    @Autowired
    ResourceLoader loader;
}
Теперь, когда вы пишете тест для ResourceService:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-config.xml" })
public class ResourceServiceTest {
    @Autowired
    ResourceService resourceService;
    @Test
    public void test() {
    ...
    }
}

Spring Testcontext Frameworkнастраивает экземпляры тестовых классов с помощью инъекции зависимостей. Итак, когда вы autowire ResourceService в своем тестовом классе, Spring введет свойство autowire ResourceLoader в ResourceService.

Comments

    Ничего не найдено.