Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用弹簧&x27;测试中的ResourceLoader_Java_Spring_Testing - Fatal编程技术网

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
    resourceLoader
    是org.springframework.context.support.GenericApplicationContext
  • 在常规执行期间,
    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() {
          ...
          }
      }
      
      通过依赖项注入配置测试类的实例。因此,当您在测试类中autowire
      ResourceService
      时,Spring会将autowired
      ResourceLoader
      属性注入到
      ResourceService
      中,您可以使用。它处理URL和类路径资源,这些资源对于简单的测试应该足够了


      DefaultResourceLoader不需要任何特殊设置。只需创建一个新实例并将其传递到您的测试中。

      我不清楚您希望ResourceLoader在测试中表现出什么样的行为?我想调用
      ResourceLoader#getResource
      ,并获得对同一资源的引用,就像我在测试上下文之外调用它一样。这意味着是一个单元测试,但它看起来更像一个测试由于对
      ResourceLoader
      的硬依赖,因此进行了集成测试。事实上,我确实希望充分利用
      ResourceLoader
      的功能。然后这是一个集成测试。:)但是撇开术语不谈,TestContext框架将通过初始化包含服务实例的Spring上下文来帮助您。在这种情况下,基本上不需要mockito,但使用它(例如,用于模拟服务的其他依赖项)并不是一种坏的做法。不幸的是,虽然所有这些都有助于将组件连接在一起,但
      ResourceLoader
      的行为与在非测试上下文中的行为不同。我将用更多细节更新我的问题您试图解决的确切资源路径是什么?检查是否适用于您的用例。资源是一个文件src/main/webapp/。我已经更新了这个问题,根据执行上下文在资源加载器上的差异-看起来测试资源加载器不知道在哪里查找。除了Mockito之类的东西之外,您还可以使用Spring的TestContext框架吗?或者,这会被认为是非常糟糕的代码味道吗?当然,您可以将Mockito与Spring的TestContext框架一起使用。您提供的测试场景是集成测试。对于单元测试,您可以使用任何模拟框架来创建模拟对象。这个链接会给你一个好主意:谢谢你的回答!接受扎吉,因为他们先到这里!