在测试中使用Spring的ResourceLoader

时间:2013-11-12 11:12:01

标签: java spring testing

@Autowire org.springframework.core.io.ResourceLoader进入@Service个班级。

在测试期间,我希望能够访问ResourceLoader的实例,以便将其注入正在测试的服务中。在测试期间获得ResourceLoader的全功能实例的最佳方法是什么?

如果那是不可能的,那么ResourceLoader还有其他选择吗?基本上,我需要让我的服务从项目中读取一些静态文件。

更新

在我的测试中开始使用@RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration;但是,现在通过ResourceLoader注入我的服务的@Autowire的行为与平常不同(即,当它不在测试环境中时)。在测试中,ResourceLoader#getResource返回指向错误相对路径的资源,而不是在常规执行期间出现的正确绝对路径。

调试时发现了一些更多信息:

  • 在测试期间,@ Autowired resourceLoaderorg.springframework.context.support.GenericApplicationContext的实例
  • 在常规执行期间,resourceLoaderorg.springframework.web.context.support.XmlWebApplicationContext
  • 的实例

3 个答案:

答案 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