Java 如何为正在读取文件的函数编写junit测试用例?
这是我的密码:Java 如何为正在读取文件的函数编写junit测试用例?,java,amazon-s3,junit,mockito,Java,Amazon S3,Junit,Mockito,这是我的密码: public String getFile() throws IOException { StringBuilder fileURI = new StringBuilder(locationName); fileURI.append(keyName); S3ObjectInputStream ts = null; ts = (S3ObjectInputStream) s3Services.getResourceStream(fileURI.toS
public String getFile() throws IOException {
StringBuilder fileURI = new StringBuilder(locationName);
fileURI.append(keyName);
S3ObjectInputStream ts = null;
ts = (S3ObjectInputStream) s3Services.getResourceStream(fileURI.toString());
String time;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(ts))) {
time = reader.readLine();
}
return time;
}
我试图模拟此函数,但不确定如何模拟InputStreamReader对象:
public void testgetTs() throws IOException {
Mockito.mock(Service.class);
StringBuilder fileURI = new StringBuilder("test");
fileURI.append("/");
fileURI.append("testFile.txt");
S3ObjectInputStream ts = null;
Mockito.when(s3Services.getResourceStream(fileURI.toString())).thenReturn(ts);
service.getTime();
}
您需要模拟任何外部资源,在您的情况下,这很难,因为您在内部创建所有资源,因此您的方法没有[单一责任][1],而是有许多。要正确地进行单元测试,您需要将其分解为单元、注入参数和模拟资源: 第1单元,构建文件名 在这里,您希望能够测试将
locationName
和keyName
设置为不同事物的结果。i、 例如FileUriBuilder(locationName,keyName).getString()
第2单元,获取资源流
在这里,您需要模拟s3Services
,并测试是否使用预期值调用了getResourceStream()
。如果您正在注入FileUriBuilder
,您将想要模拟它
第三单元,阅读流
在这里,您希望模拟出S3ObjectInputStream
,并确保调用了正确的方法,并且当它返回某个内容时,该单元会按预期报告它
[1] :https://en.wikipedia.org/wiki/Single-responsibility_principle#:~:text=%20single%2Responsibility%20原则%20(SRP,功能%2C%20,它应该%20it%20封装它
StringBuilder fileURI = new StringBuilder(locationName);
fileURI.append(keyName);
S3ObjectInputStream ts = null;
ts = (S3ObjectInputStream) s3Services.getResourceStream(fileURI.toString());
String time;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(ts))) {
time = reader.readLine();
}
return time;