Springboot单元测试获取Resources文件的8个姿势

引入依赖

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {IdempotentApplication.class})
public class ResourceTest {

private final String resourceName = "template/1.text";

/**
* 通过class.getClassLoader获取
*/
@Test
public void function1() {
try {
String path = this.getClass().getClassLoader().getResource("").getPath();// getResource("")里面是空字符串
String filepath = path + resourceName;
getFileContent(filepath);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 通过文件名getPath来获取路径
*/
@Test
public void function2() {
try {
String path = this.getClass().getClassLoader().getResource(resourceName).getPath();
String filePath = URLDecoder.decode(path, "UTF-8");//如果路径中带有中文会被URLEncoder,因此这里需要解码
getFileContent(filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 直接通过文件名 + getFile()获取
*/
@Test
public void function3() {
try {
String path = this.getClass().getClassLoader().getResource(resourceName).getFile();
String filePath = URLDecoder.decode(path, "UTF-8");//如果路径中带有中文会被URLEncoder,因此这里需要解码
getFileContent(filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 直接使用getResourceAsStream方法获取流
* springboot项目中需要使用此种方法,因为jar包中没有一个实际的路径存放文件
*/
@Test
public void function4() {
try {
InputStream in = this.getClass().getClassLoader().getResourceAsStream(resourceName);
getFileContent(in);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 直接使用getResourceAsStream方法获取流
* 如果不使用getClassLoader,可以使用getResourceAsStream("/配置测试.txt")直接从resources根路径下获取
*/
@Test
public void function5() {
try {
InputStream in = this.getClass().getResourceAsStream("/"+resourceName);
getFileContent(in);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 通过ClassPathResource类获取,建议SpringBoot中使用
* springboot项目中需要使用此种方法,因为jar包中没有一个实际的路径存放文件
*/
@Test
public void function6() {
try {
ClassPathResource cb = new ClassPathResource(resourceName);
InputStream in = cb.getInputStream();
getFileContent(in);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过绝对路径获取项目中文件的位置(不能用于服务器)
*/
@Test
public void function7() {
try {
String rootPath = System.getProperty("user.dir");
String filePath = rootPath + "/src/main/resources/" + resourceName;
getFileContent(filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过绝对路径获取项目中文件的位置(不能用于服务器)
*/
@Test
public void function8() {
try {
//参数为空
File directory = new File("");
//规范路径:getCanonicalPath() 方法返回绝对路径,会把 ..\ 、.\ 这样的符号解析掉
String rootCanonicalPath = directory.getCanonicalPath();
//绝对路径:getAbsolutePath() 方法返回文件的绝对路径,如果构造的时候是全路径就直接返回全路径,如果构造时是相对路径,就返回当前目录的路径 + 构造 File 对象时的路径
String filePath = rootCanonicalPath + "/src/main/resources/" + resourceName;
getFileContent(filePath);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 根据文件路径读取文件内容
*
* @param fileInPath 文件路径
* @throws IOException 异常
*/
public static void getFileContent(Object fileInPath) throws IOException {
BufferedReader br = null;
if (fileInPath == null) {
return;
}
if (fileInPath instanceof String) {
br = new BufferedReader(new FileReader((String) fileInPath));
} else if (fileInPath instanceof InputStream) {
br = new BufferedReader(new InputStreamReader((InputStream) fileInPath));
}
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println(sb.toString());
br.close();
}
}