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;