Puede alguien sugerir una manera fácil de obtener una referencia a un archivo como una Cadena/InputStream/Archivo/etc tipo de objeto en una prueba de junit clase? Obviamente me podría pegar el archivo xml (en este caso) como un gigante de la Cadena o leer en un archivo, pero es que hay un acceso directo específico para Junit como este?

public class MyTestClass{

@Resource(path="something.xml")
File myTestFile;

@Test
public void toSomeTest(){
...
}

}
InformationsquelleAutor benstpierre | 2010-04-08

5 Comentarios

  1. 81

    Puede intentar @Rule anotación. Aquí está el ejemplo de la documentación:

    public static class UsesExternalResource {
        Server myServer = new Server();
    
        @Rule public ExternalResource resource = new ExternalResource() {
            @Override
            protected void before() throws Throwable {
                myServer.connect();
            };
    
            @Override
            protected void after() {
                myServer.disconnect();
            };
        };
    
        @Test public void testFoo() {
            new Client().run(myServer);
        }
    }

    Usted sólo tiene que crear FileResource clase se extiende ExternalResource.

    Ejemplo Completo

    import static org.junit.Assert.*;
    
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.rules.ExternalResource;
    
    public class TestSomething
    {
        @Rule
        public ResourceFile res = new ResourceFile("/res.txt");
    
        @Test
        public void test() throws Exception
        {
            assertTrue(res.getContent().length() > 0);
            assertTrue(res.getFile().exists());
        }
    }

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import org.junit.rules.ExternalResource;
    public class ResourceFile extends ExternalResource
    {
    String res;
    File file = null;
    InputStream stream;
    public ResourceFile(String res)
    {
    this.res = res;
    }
    public File getFile() throws IOException
    {
    if (file == null)
    {
    createFile();
    }
    return file;
    }
    public InputStream getInputStream()
    {
    return stream;
    }
    public InputStream createInputStream()
    {
    return getClass().getResourceAsStream(res);
    }
    public String getContent() throws IOException
    {
    return getContent("utf-8");
    }
    public String getContent(String charSet) throws IOException
    {
    InputStreamReader reader = new InputStreamReader(createInputStream(),
    Charset.forName(charSet));
    char[] tmp = new char[4096];
    StringBuilder b = new StringBuilder();
    try
    {
    while (true)
    {
    int len = reader.read(tmp);
    if (len < 0)
    {
    break;
    }
    b.append(tmp, 0, len);
    }
    reader.close();
    }
    finally
    {
    reader.close();
    }
    return b.toString();
    }
    @Override
    protected void before() throws Throwable
    {
    super.before();
    stream = getClass().getResourceAsStream(res);
    }
    @Override
    protected void after()
    {
    try
    {
    stream.close();
    }
    catch (IOException e)
    {
    //ignore
    }
    if (file != null)
    {
    file.delete();
    }
    super.after();
    }
    private void createFile() throws IOException
    {
    file = new File(".",res);
    InputStream stream = getClass().getResourceAsStream(res);
    try
    {
    file.createNewFile();
    FileOutputStream ostream = null;
    try
    {
    ostream = new FileOutputStream(file);
    byte[] buffer = new byte[4096];
    while (true)
    {
    int len = stream.read(buffer);
    if (len < 0)
    {
    break;
    }
    ostream.write(buffer, 0, len);
    }
    }
    finally
    {
    if (ostream != null)
    {
    ostream.close();
    }
    }
    }
    finally
    {
    stream.close();
    }
    }
    }

    • ¿Podría dar un ejemplo más detallado? Se le dará mucho más upvotes…
    • Acaba de hacer para demostrar que te equivocaste.
    • Sólo upvoted con la esperanza de ayudar a probar su derecho.
    • Wow. Parece que es mi mejor respuesta hasta ahora. Yo soy muy malo a la hora de predecir el futuro.
  2. 76

    Si usted necesita para realmente obtener un File objeto, se podría hacer lo siguiente:

    URL url = this.getClass().getResource("/test.wsdl");
    File testWsdl = new File(url.getFile());

    Que tiene la ventaja de trabajar en la plataforma de la cruz, como se describe en este blog.

  3. 14

    Yo sé que usted dijo que usted no desea leer el archivo en la mano, pero esto es bastante fácil

    public class FooTest
    {
    private BufferedReader in = null;
    @Before
    public void setup()
    throws IOException
    {
    in = new BufferedReader(
    new InputStreamReader(getClass().getResourceAsStream("/data.txt")));
    }
    @After
    public void teardown()
    throws IOException
    {
    if (in != null)
    {
    in.close();
    }
    in = null;
    }
    @Test
    public void testFoo()
    throws IOException
    {
    String line = in.readLine();
    assertThat(line, notNullValue());
    }
    }

    Todo lo que tiene que hacer es asegurarse de que el archivo en cuestión está en el classpath. Si usted está usando Maven, sólo hay que poner el archivo en el directorio src/test/resources y Maven va a incluir en el classpath cuando se ejecutan las pruebas. Si usted necesita para hacer este tipo de cosas mucho, podrías poner el código que abre el archivo en una superclase, y tienen sus pruebas de heredar de que.

    • Gracias por que en realidad dice que el archivo debe estar situado, no sólo de cómo abrirlo!
  4. 1

    Usted puede tratar de hacer:

    String myResource = IOUtils.toString(this.getClass().getResourceAsStream("yourfile.xml")).replace("\n","");
  5. 1

    Si quieres cargar una prueba de recursos del archivo como una cadena con sólo unas líneas de código y sin ningún extra dependencias, este es el truco:

    public String loadResourceAsString(String fileName) throws IOException {
    Scanner scanner = new Scanner(getClass().getClassLoader().getResourceAsStream(fileName));
    String contents = scanner.useDelimiter("\\A").next();
    scanner.close();
    return contents;
    }

    «\\A» coincide con el inicio de la entrada y hay sólo uno. Así que este analiza todo el contenido del archivo y devuelve una cadena de texto. Lo mejor de todo, no requiere de la 3ª parte de las bibliotecas (como IOUTils).

Dejar respuesta

Please enter your comment!
Please enter your name here