我@Autowire
org.springframework.core.io.ResourceLoader
进入@Service
个班级。
在测试期间,我希望能够访问ResourceLoader
的实例,以便将其注入正在测试的服务中。在测试期间获得ResourceLoader
的全功能实例的最佳方法是什么?
如果那是不可能的,那么ResourceLoader
还有其他选择吗?基本上,我需要让我的服务从项目中读取一些静态文件。
更新:
在我的测试中开始使用@RunWith(SpringJUnit4ClassRunner.class)
+ @ContextConfiguration
;但是,现在通过ResourceLoader
注入我的服务的@Autowire
的行为与平常不同(即,当它不在测试环境中时)。在测试中,ResourceLoader#getResource
返回指向错误相对路径的资源,而不是在常规执行期间出现的正确绝对路径。
调试时发现了一些更多信息:
resourceLoader
是org.springframework.context.support.GenericApplicationContext
的实例resourceLoader
是org.springframework.web.context.support.XmlWebApplicationContext
答案 0 :(得分:2)
您可以使用DefaultResourceLoader。它处理URL和类路径资源,这对于简单测试应该足够了。
DefaultResourceLoader不需要任何特殊设置。只需创建一个新实例并将其传递给您的测试。
答案 1 :(得分:1)
你想写什么样的考试?
如果是单元测试,您应该模拟ResourceLoader
并将该模拟注入服务实例。 (例如使用mockito)
如果是集成测试,最好使用Spring TestContext框架。创建一个包含测试所需的所有组件的spring上下文,然后使用@RunWith(SpringJUnit4ClassRunner.class)
+
@ContextConfiguration
注释您的测试类,这样就可以自动装配完全配置的bean(例如要测试的服务实例)在测试课上。
答案 2 :(得分:1)
我认为您已将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通过依赖注入配置测试类的实例。因此,当您在测试类中自动装配ResourceService
时,Spring会将自动装配的ResourceLoader
属性注入ResourceService
。