Использование 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
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 введет свойство autowireResourceLoaderвResourceService.
Comments