Easy way to get a test file into JUnit

前端 未结 5 1784
面向向阳花
面向向阳花 2020-12-08 04:04

Can somebody suggest an easy way to get a reference to a file as a String/InputStream/File/etc type object in a junit test class? Obviously I could paste the file (xml in t

相关标签:
5条回答
  • 2020-12-08 04:11

    If you need to actually get a File object, you could do the following:

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

    Which has the benefit of working cross platform, as described in this blog post.

    0 讨论(0)
  • 2020-12-08 04:12

    I know you said you didn't want to read the file in by hand, but this is pretty easy

    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());
        }
    }
    

    All you have to do is ensure the file in question is in the classpath. If you're using Maven, just put the file in src/test/resources and Maven will include it in the classpath when running your tests. If you need to do this sort of thing a lot, you could put the code that opens the file in a superclass and have your tests inherit from that.

    0 讨论(0)
  • 2020-12-08 04:14

    You can try doing:

    String myResource = IOUtils.toString(this.getClass().getResourceAsStream("yourfile.xml")).replace("\n","");
    
    0 讨论(0)
  • 2020-12-08 04:29

    If you want to load a test resource file as a string with just few lines of code and without any extra dependencies, this does the trick:

    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" matches the start of input and there's only ever one. So this parses the entire file contents and returns it as a string. Best of all, it doesn't require any 3rd party libraries (like IOUTils).

    0 讨论(0)
  • 2020-12-08 04:30

    You can try @Rule annotation. Here is the example from the docs:

    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);
        }
    }
    

    You just need to create FileResource class extending ExternalResource.

    Full Example

    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();
            }
        }
    
    }
    

    0 讨论(0)
提交回复
热议问题