我有以下课程:
public class XXX {
public <T> List<T> loadXXXList(Class<T> type, String fileName) {
try {
return new CsvToBeanBuilder<T>(new FileReader(fileName)).withSeparator('X')
.withType(type).build().parse();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error occurred while loading object list from file " + fileName);
return Collections.emptyList();
}
}
}
测试或重组它以进行测试,单元或集成的最佳方法是什么?我正在考虑在返回CsvToBeanBuilder的类中创建一个新函数,该函数可以模拟引发异常或在.parse()上返回列表? 像这样:
public class XXX {
public <T> List<T> loadXXXList(Class<T> type, String fileName) {
try {
return SOMETHING.parse();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error occurred while loading object list from file " + fileName);
return Collections.emptyList();
}
}
public SOMETHING something(type,filename){
return new CsvToBeanBuilder<T>(new FileReader(fileName)).withSeparator('X')
.withType(type).build()
}
}
但是我不知为何不相信这看起来不错,并且将小问题缝成了大麻烦,而是将逻辑移到了另一个地方。谢谢
答案 0 :(得分:1)
不。您不应该公开或模拟CsvToBeanBuilder之类的内部实现细节。 您真正的外部依赖关系是文件系统,在进行单元测试进行模拟之前需要对其进行概括,因为在测试中创建临时文件是一种代码味道。
尝试重构您的类以接受InputStream而不是文件路径。这样,您可以编写一个完全在内存中工作的单元测试。