Cómo probar una clase que lee de un archivo.
Puedo definir un par de clases que se encargan de leer diferentes formas desde diferentes tipos de archivo (json, csv, xml) y posiblemente más adelante desde un servicio web.
Se me ha ocurrido crear una interfaz común llamada ShapeReader
.
public interface ShapeReader {
List<shapes> readShapes() throws Exception;
}
Tengo un par de clases que implementan esta interfaz.
FlatFileReader
public class FlatFileReader implements ShapeReader {
private static final String filename = "shapes.txt";
@Override
public List<shape> readShapes() throws Exception {
List<shape> shapes = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new ClassPathResource(filename).getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
// crear objetos de forma
);
shapes.add(shape);
}
log.info("Elementos leídos desde el archivo json: " + items);
}
catch (Exception e) {
// manejar error
}
return shapes;
}
}
XmlReader
public class XmlReader implements ShapeReader {
private static final String filename = "shapes.xml";
@Override
public List<shape> readShapes() throws Exception {
List<shape> shapes = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new ClassPathResource(filename).getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
// crear objetos de forma desde xml
);
shapes.add(shape);
}
log.info("Elementos leídos desde el archivo json: " + items);
}
catch (Exception e) {
// manejar error
}
return shapes;
}
}
No estoy seguro de cómo probar esto. Estaba pensando en leer desde un archivo de prueba falso llamado test.txt
, pero el nombre de archivo está codificado como una constante estática. ¿Cuál es la mejor manera de resolver este problema que asumo es un diseño deficiente?
davy.ai
Para resolver el problema del nombre de archivo codificado en las clases
FlatFileReader
yXmlReader
, puedes modificar el constructor de ambas clases para aceptar un parámetro de nombre de archivo. De esta manera, puedes pasar el nombre de archivo durante la instanciación del objeto y probar fácilmente las clases con diferentes nombres de archivo.Por ejemplo:
Luego puedes modificar tu código de pruebas para crear los objetos
FlatFileReader
yXmlReader
con diferentes nombres de archivo y probarlos según sea necesario. Además, puedes crear archivos simulados para propósitos de prueba y pasar esos nombres de archivo durante las pruebas.Esta modificación reduce la dependencia del nombre de archivo estático y hace que el código sea más flexible y probable.