¿Cómo simulacro de lectura de archivos / escritura a través de JUnit?
Aquí está mi escenario
MyHandler.java
public abstract class MyHandler {
private String path = //..path/to/file/here
public synchronized void writeToFile(String infoText) {
// Some processing
// Writing to File Here
File file = FileUtils.getFile(filepath);
file.createNewFile();
// file can't be written, throw FileWriteException
if (file.canWrite()) {
FileUtils.writeByteArrayToFile(file, infoText.getBytes(Charsets.UTF_8));
} else {
throw new FileWriteException();
}
}
public String readFromFile() {
// Reading from File here
String infoText = "";
File file = new File(path);
// file can't be read, throw FileReadException
if (file.canRead()) {
infoText = FileUtils.readFileToString(file, Charsets.UTF_8);
} else {
throw FileReadException();
}
return infoText
}
}
MyHandlerTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest({
MyHandler.class
})
public class MyHandlerTest {
private static MyHandler handler = null;
// Some Initialization for JUnit (i.e @Before, @BeforeClass, @After, etc)
@Test(expected = FileWriteException.class)
public void writeFileTest() throws Exception {
handler.writeToFile("Test Write!");
}
@Test(expected = FileReadException.class)
public void readFileTest() throws Exception {
handler.readFromFile();
}
}
Dado anteriormente fuente, Escenario cuando el archivo no se puede escribir (permiso de escritura no permitido) está bien, sin embargo, cuando intento hacer escenario en el que file
no se puede leer (permiso de lectura no permitido). Siempre leer el archivo, ya he intentado modificar el permiso de archivo en el código de prueba a través de abajo
File f = new File("..path/to/file/here");
f.setReadable(false);
Sin embargo, he hecho un poco de lectura, setReadable()
siempre devuelve falso (no) cuando se ejecuta en la máquina de Windows.
¿Hay una manera de modificar el permiso de archivo del archivo de destino mediante programación en relación con JUnit?
Nota
Objetivo código fuente a prueba no puede ser modificado, es decir
Myhandler.class
es un código heredado, que no debe ser modificado.
En lugar de depender de los permisos de archivo del sistema operativo, el uso PowerMock para burlarse FileUtils.getFile (...) y hacer que devolver una instancia de archivo (por ejemplo subclase anónima) que devuelve un valor específico para CanWrite () / CanRead ().