我正在尝试在单元测试中读取类路径中的文件:
@Value("classpath:state.json")
Resource stateFile;
我在state.json
目录中有src/test/resources
个文件。
当我尝试使用stateFile.getInputStream()
读取此文件时,它不会返回任何内容。我做错了什么?
我的测试类注释如下
@RunWith(SpringRunner.class)
@SpringBootTest
如果我尝试使用不正确的文件,我可以看到代码失败。所以我认为它在类路径中看到文件但由于某种原因没有阅读内容。
答案 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: