Java 缓冲读取器测试
我想测试一个方法,它可以从特定的URL地址获取数据,并将其作为字符串添加到ArrayList中。目前的代码是: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
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更新了我的答案