5

我正在@Autowire上课org.springframework.core.io.ResourceLoader@Service

在测试期间,我想访问 a 的实例ResourceLoader,以便可以将其注入到正在测试的服务中。在测试期间获得完整功能实例的最佳方法是什么ResourceLoader

如果这不可能,是否有替代方案ResourceLoader?本质上,我需要让我的服务从项目中读取一些静态文件。

更新

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

调试时发现的更多信息:

  • 在测试期间,@AutowiredresourceLoader是一个 instanceoforg.springframework.context.support.GenericApplicationContext
  • 在常规执行期间,resourceLoaderorg.springframework.web.context.support.XmlWebApplicationContext
4

4 回答 4

8

您可以使用DefaultResourceLoader。它处理 URL 和类路径资源,对于简单的测试来说应该足够了。

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

于 2017-03-21T08:18:21.657 回答
3

你想写什么样的测试?

如果是单元测试,您可能应该模拟ResourceLoader并将该模拟注入服务实例。(例如使用模拟)

如果是集成测试,最好使用Spring TestContext框架。创建一个包含测试所需的所有组件的 spring 上下文,然后用@RunWith(SpringJUnit4ClassRunner.class)+注释您的测试类 @ContextConfiguration,这将可以在测试类中自动装配完全配置的 bean(例如要测试的服务实例)。

于 2013-11-12T11:55:11.363 回答
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 框架通过依赖注入配置测试类的实例。因此,当您ResourceService在测试类中自动装配时,Spring 会将 autowiredResourceLoader属性注入到ResourceService.

于 2013-11-12T12:07:57.073 回答
0

环境:

Java: 17
Springboot: 2.6.2
Junit-jupiter:5.8.2

通常集成测试需要启动一个容器来执行测试用例。这可以使用以下代码来实现:

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ResourceLoader;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.jupiter.api.Assertions.assertTrue;

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations = "classpath:application-integration-test.properties")
class TemplateKeyValidatorIT {

    @Autowired
    ResourceLoader resourceLoader;

    @Autowired
    private ResourceLoaderService resourceLoaderService;

    @Test
    void testResourceLoading() {

        // Given
        String fileName = "myTestFile.txt";

        // When
        File file = resourceLoaderService.load(fileName);

        // Then
        assertTrue(file.exists());
    }

}

@RunWith(SpringRunner.class): SpringRunner 是基础的 Spring 框架 Runner。它扩展了 SpringJUnit4ClassRunner,但它只是该类的别名。

@SpringBootTest:需要注解来引导整个容器;它创建一个 ApplicationContext 将被集成测试使用。

@TestPropertySource(locations = "classpath:application-integration-test.properties"):加载集成特定的应用程序属性。

注意:这将引导真正的应用程序上下文,但您可以使用以下方法分离测试配置类:

@TestConfiguration
public class MyTestContextConfiguration {
    
    @Bean
    public ResourceLoaderService resourceLoaderService() {
        return new ResourceLoaderService() { 
            // implement methods 
        };
    }
 }

然后可以通过您的测试类使用:

@Import(MyTestContextConfiguration.class)

于 2022-01-18T11:50:22.050 回答