Uso servidores integrados que se ejecutan dentro de casos de prueba de Junit. A veces estos servidores requieren un directorio de trabajo (por ejemplo, el servidor Apache Directory).Cómo gestionar el pedido de @ Rule cuando son dependientes entre sí
La nueva @Rule en Junit 4.7 puede manejar estos casos. TemporaryFolder-Rule puede crear un directorio temporal. Se puede crear una regla de recurso externo personalizada para el servidor. Pero ¿Cómo manejo si quiero pasar el resultado de una regla a la otra;
import static org.junit.Assert.assertEquals;
import java.io.*;
import org.junit.*;
import org.junit.rules.*;
public class FolderRuleOrderingTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Rule
public MyNumberServer server = new MyNumberServer(folder);
@Test
public void testMyNumberServer() throws IOException {
server.storeNumber(10);
assertEquals(10, server.getNumber());
}
/** Simple server that can store one number */
private static class MyNumberServer extends ExternalResource {
private TemporaryFolder folder;
/** The actual datafile where the number are stored */
private File dataFile;
public MyNumberServer(TemporaryFolder folder) {
this.folder = folder;
}
@Override
protected void before() throws Throwable {
if (folder.getRoot() == null) {
throw new RuntimeException("TemporaryFolder not properly initialized");
}
//All server data are stored to a working folder
File workingFolder = folder.newFolder("my-work-folder");
dataFile = new File(workingFolder, "datafile");
}
public void storeNumber(int number) throws IOException {
dataFile.createNewFile();
DataOutputStream out = new DataOutputStream(new FileOutputStream(dataFile));
out.writeInt(number);
}
public int getNumber() throws IOException {
DataInputStream in = new DataInputStream(new FileInputStream(dataFile));
return in.readInt();
}
}
}
En este código de la carpeta se envía como un parámetro en el servidor para que el servidor puede crear un directorio de trabajo para almacenar datos . Sin embargo, esto no funciona porque Junit procesa las reglas en orden inverso ya que están definidas en el archivo. La Regla TemporaryFolder no se ejecutará antes de la Regla del servidor. Por lo tanto, la carpeta raíz en TempraryFolder será nula, lo que resulta en que los archivos se crean en relación con el directorio de trabajo actual.
Si invierto el orden de los atributos en mi clase, obtengo un error de compilación porque no puedo hacer referencia a una variable antes de que esté definida.
estoy usando Junit 4.8.1 (ya que el orden de las reglas se fijó un poco de la versión 4.7)
¿Cómo se solucionó el problema de 4.7 a 4.8? – zedoo