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

时间:2017-04-15 16:14:32

标签: java spring spring-boot

我正在尝试在单元测试中读取类路径中的文件:

@Value("classpath:state.json")
Resource stateFile;

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

我的测试类注释如下

@RunWith(SpringRunner.class)
@SpringBootTest

如果我尝试使用不正确的文件,我可以看到代码失败。所以我认为它在类路径中看到文件但由于某种原因没有阅读内容。

5 个答案:

答案 0 :(得分:5)

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

@Value("${stateJsonPath}")
Resource stateFile;

如果必须从硬编码路径获取资源,请使用此方法。

Resource stateFile = new ClassPathResource("state.json");

答案 1 :(得分:1)

我刚碰到这个。我正在使用Maven。我看了一下我的target / test-classes文件夹,我的资源文件不在那里(即使它在我的src / test / resources文件夹中)。

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

因此,在您执行mvn clean之前,似乎不会复制您的资源。 JUnit正在查看maven构建的类路径,直到文件实际进入target / test-classes文件夹,JUnit才能找到它。

答案 2 :(得分:0)

在另一个post中找到了这个。这样可以使用该文件。

@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());

}

}

答案 3 :(得分:0)

这应该很简单,请注意路径以点开头表示当前目录;

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

    File file = new File(path, fileName);

    assertTrue(file.exists());
}

答案 4 :(得分:0)

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

的一部分。
@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();
        ...
        ...
    }

}

注意:使用分类器 classpath:

时,文件应显示在类路径中