Java 使用弹簧&x27;测试中的ResourceLoader
我正在Java 使用弹簧&x27;测试中的ResourceLoader,java,spring,testing,Java,Spring,Testing,我正在@Autowire将org.springframework.core.io.ResourceLoader加载到我的@Service类中 在测试期间,我希望能够访问ResourceLoader的一个实例,以便将其注入正在测试的服务中。在测试期间,获取ResourceLoader的完整功能实例的最佳方法是什么 如果不可能,是否有ResourceLoader的替代方案?基本上,我需要让我的服务从项目中读取一些静态文件 更新: 在我的测试中开始使用@RunWith(SpringJUnit4Clas
@Autowire
将org.springframework.core.io.ResourceLoader
加载到我的@Service
类中
在测试期间,我希望能够访问ResourceLoader
的一个实例,以便将其注入正在测试的服务中。在测试期间,获取ResourceLoader
的完整功能实例的最佳方法是什么
如果不可能,是否有ResourceLoader
的替代方案?基本上,我需要让我的服务从项目中读取一些静态文件
更新:
在我的测试中开始使用@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
;但是,现在通过@Autowire
注入到我的服务中的ResourceLoader
的行为与平常不同(即,当它不在测试上下文中时)。在测试中,ResourceLoader#getResource
返回指向错误相对路径的资源,而不是在常规执行期间出现的正确绝对路径
调试时发现的更多信息:
- 在测试期间,@Autowired
是org.springframework.context.support.GenericApplicationContextresourceLoader
- 在常规执行期间,
是resourceLoader
org.springframework.web.context.support.XmlWebApplicationContext
- 您想编写什么样的测试
如果是单元测试,您可能应该模拟
ResourceLoader
,并将该模拟注入服务实例。(以mockito为例)
如果这是一个集成测试,那么最好使用该框架。创建包含测试所需的所有组件的spring上下文,然后使用@RunWith(SpringJUnit4ClassRunner.class)
+
@ContextConfiguration
,这将使在测试类中自动连接完全配置的bean(例如,要测试的服务实例)成为可能。我想您的服务定义如下:
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() {
...
}
}
通过依赖项注入配置测试类的实例。因此,当您在测试类中autowireResourceService
时,Spring会将autowiredResourceLoader
属性注入到ResourceService
中,您可以使用。它处理URL和类路径资源,这些资源对于简单的测试应该足够了
DefaultResourceLoader不需要任何特殊设置。只需创建一个新实例并将其传递到您的测试中。我不清楚您希望ResourceLoader在测试中表现出什么样的行为?我想调用ResourceLoader#getResource
,并获得对同一资源的引用,就像我在测试上下文之外调用它一样。这意味着是一个单元测试,但它看起来更像一个测试由于对ResourceLoader
的硬依赖,因此进行了集成测试。事实上,我确实希望充分利用ResourceLoader
的功能。然后这是一个集成测试。:)但是撇开术语不谈,TestContext框架将通过初始化包含服务实例的Spring上下文来帮助您。在这种情况下,基本上不需要mockito,但使用它(例如,用于模拟服务的其他依赖项)并不是一种坏的做法。不幸的是,虽然所有这些都有助于将组件连接在一起,但ResourceLoader
的行为与在非测试上下文中的行为不同。我将用更多细节更新我的问题您试图解决的确切资源路径是什么?检查是否适用于您的用例。资源是一个文件src/main/webapp/。我已经更新了这个问题,根据执行上下文在资源加载器上的差异-看起来测试资源加载器不知道在哪里查找。除了Mockito之类的东西之外,您还可以使用Spring的TestContext框架吗?或者,这会被认为是非常糟糕的代码味道吗?当然,您可以将Mockito与Spring的TestContext框架一起使用。您提供的测试场景是集成测试。对于单元测试,您可以使用任何模拟框架来创建模拟对象。这个链接会给你一个好主意:谢谢你的回答!接受扎吉,因为他们先到这里!