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