Java 缓冲读取器测试

Java 缓冲读取器测试,java,testing,junit,tdd,Java,Testing,Junit,Tdd,我想测试一个方法,它可以从特定的URL地址获取数据,并将其作为字符串添加到ArrayList中。目前的代码是: public List<String> getListOfAirportsFromCsvAsAStrings(String urlAddress) { BufferedReader reader = null; try { URL url = new URL(urlAddress); HttpURLConnection c

我想测试一个方法,它可以从特定的URL地址获取数据,并将其作为字符串添加到ArrayList中。目前的代码是:

public List<String> getListOfAirportsFromCsvAsAStrings(String urlAddress) {

    BufferedReader reader = null;

    try {
        URL url = new URL(urlAddress);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("GET");

        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

        String line = null;
        while ((line = reader.readLine()) != null) {
            airportsAsAStringFromCsvFile.add(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
    return airportsAsAStringFromCsvFile;
}
public List getListofAirPortsFromCsvasstrings(字符串URL地址){
BufferedReader reader=null;
试一试{
URL=新URL(URL地址);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod(“GET”);
reader=new BufferedReader(new InputStreamReader(connection.getInputStream());
字符串行=null;
而((line=reader.readLine())!=null){
AirportsAstringFromCsvFile.add(行);
}
}捕获(例外e){
e、 printStackTrace();
}最后{
if(读卡器!=null){
试一试{
reader.close();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
}
返回机场从CSvFile开始;
}

这个方法是可测试的吗?

就目前而言,这个方法很难测试。正如标签上所说,这显然不是以TDD方式完成的

不要在测试代码中创建HttpURLConnection。让打电话的人传一个进去。这样,您就可以在测试中轻松地模拟它,并通过看起来像网络连接但不是真实连接的东西。将外部依赖项(如网络)排除在单元测试之外。在生产代码中,如果在一个地方创建连接,则可以轻松添加连接池或其他连接详细信息

不要接受例外情况。任何错误都不会被注意到。未来数小时的调试乐趣。您甚至不能测试错误行为

AirportsAstringfromCSvFile
是否为成员变量?它可能应该是一个局部变量,您可以将函数设置为静态

您可能还希望使用try with资源

至于TDD书籍,您可以尝试:

  • ---很老了,但可能还有一些好的指针


这是一段无法正确进行单元测试的糟糕代码,单元测试是关于测试某些代码“单元”的,通常是隔离类,如果此代码需要其他类来工作,则需要使用模拟类,而不是真正的实现

在您的例子中,您应该将进入网络的代码和从流中读取的代码解耦

 public class Parser {

    public  List<String> getListOfAirportsFromCsvAsAStrings(InputStream inputCsvData) {
        List<String> airportsAsAStringFromCsvFile = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputCsvData))) {
            String line = null;
            while ((line = reader.readLine()) != null) {
                airportsAsAStringFromCsvFile.add(line);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return airportsAsAStringFromCsvFile;
    }
}
公共类解析器{
公共列表GetListofAirportsFromCsvastrings(InputStream inputCsvData){
List AirportsAstringFromCsvFile=new ArrayList();
try(BufferedReader=new BufferedReader(new InputStreamReader(inputCsvData))){
字符串行=null;
而((line=reader.readLine())!=null){
AirportsAstringFromCsvFile.add(行);
}
}捕获(IOE异常){
抛出新的运行时异常(e);
}
返回机场从CSvFile开始;
}
}
我简化了您的代码(需要Java7或更高版本)。这是解析器的测试类:

import example.Parser;
import org.junit.Assert;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

    public class ParserTest {

        @Test
        public void shouldReturnParsedTextFromInputFileStream() throws Exception {
            String text = "row1\nrow2\nrow3";
            InputStream inputFileStream = new ByteArrayInputStream(text.getBytes());
            Parser parser = new Parser();
            List<String> result = parser.getListOfAirportsFromCsvAsAStrings(inputFileStream);
            List<String> expected = Arrays.asList("row1", "row2", "row3");
            Assert.assertEquals(expected, result);
        }
    }
import-example.Parser;
导入org.junit.Assert;
导入org.junit.Test;
导入java.io.ByteArrayInputStream;
导入java.io.InputStream;
导入java.util.array;
导入java.util.List;
公共类ParserTest{
@试验
public void应返回ParsedTextFromInputFileStream()引发异常{
String text=“row1\nrow2\nrow3”;
InputStream inputFileStream=new ByteArrayInputStream(text.getBytes());
Parser Parser=新解析器();
列表结果=parser.getListoFairPortsFromCsvasstrings(inputFileStream);
所需列表=Arrays.asList(“第1行”、“第2行”、“第3行”);
Assert.assertEquals(预期,结果);
}
}
假设类路径中有junit库。
另外,在我看来,这段代码还是有味道的,你需要更多的重构你的代码。

答案不错,但问题本身太宽泛了。好的,谢谢你,你知道什么好的TDD测试教程吗?我看了一些书,教程,但例子很简单,不是从真正的代码。。。我很难改变对TDD的想法testing@przemekost试试这个@przemekost更新了我的答案