Java Spring boot:如何在单元测试中从类路径读取资源

Java Spring boot:如何在单元测试中从类路径读取资源,java,spring,spring-boot,Java,Spring,Spring Boot,在单元测试中,我正试图从类路径读取一个文件,如下所示: @Value("classpath:state.json") Resource stateFile; 我在src/test/resources目录中有state.json文件。 当我尝试使用stateFile.getInputStream()读取此文件时,它不会返回任何内容。我做错了什么 我的测试类是这样注释的 @RunWith(SpringRunner.class) @SpringBootTest 如果我尝试使用错误的文件,我可以看到

在单元测试中,我正试图从类路径读取一个文件,如下所示:

@Value("classpath:state.json")
Resource stateFile;
我在
src/test/resources
目录中有
state.json
文件。 当我尝试使用
stateFile.getInputStream()
读取此文件时,它不会返回任何内容。我做错了什么

我的测试类是这样注释的

@RunWith(SpringRunner.class)
@SpringBootTest

如果我尝试使用错误的文件,我可以看到代码失败。因此,我认为它可以在类路径中看到文件,但出于某种原因,它不能读取内容。

除非定义了@Value资源的属性,否则无法访问该资源。 应该是这样

@Value("${stateJsonPath}")
Resource stateFile;
Resource stateFile = new ClassPathResource("state.json");
如果必须从硬编码路径获取资源,请使用这种方式

@Value("${stateJsonPath}")
Resource stateFile;
Resource stateFile = new ClassPathResource("state.json");

我刚碰到这个。我在用Maven。我查看了一下我的target/testclasses文件夹,但我的资源文件不在其中(即使它在我的src/test/resources文件夹中)

我运行了
mvn clean install
,然后重新检查了我的目标/测试类文件夹,资源文件现在就在那里了。在那之后,我的测试能够找到文件,并且测试工作正常

因此,在执行
mvn clean
之前,您的资源似乎不会被复制。JUnit正在查看maven构建的类路径,在文件真正进入目标/测试类文件夹之前,JUnit将无法找到它。

在另一个文件夹中找到它。这适用于能够使用该文件

@SpringBootTest
public class SomeTest {

File catalogFile;

@Before
public void setUp() {
    catalogFile = new File("src/test/java/resources/catalog.json");
}

@Test
public void catalog_model_is_useable () {

    assert(catalogFile.exists());

}

}

这应该很简单,注意路径以一个点开始,表示当前目录

@Test   
public void testFile() {
    String path = "./src/test/resources";
    String fileName = "test.zip";

    File file = new File(path, fileName);

    assertTrue(file.exists());
}

为子孙后代共享工作解决方案。可以使用
org.springframework.core.io.ResourceLoader
读取类路径中的文件。例如,我在目录
src/test/java/resources/data
下有一个名为
posts.json
的示例数据文件,我必须在测试用例执行期间加载它,作为
@之前的一部分

@ActiveProfiles("test")
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleTest {

    @Autowired
    private ResourceLoader resourceLoader = null;

    @BeforeEach
    void init() {
        File dataFile = resourceLoader.getResource("classpath:data/posts.json").getFile();
        ...
        ...
    }

}

注意:使用分类器时,文件应显示在类路径中
类路径:

这是什么资源类?大概有5个。可能
org.springframework.core.io.ClassPathResource
org.springframework.core.io.Resource