首页 文章

将测试文件放入JUnit的简便方法

提问于
浏览
71

有人可以建议一种简单的方法来获取对junit测试类中的String / InputStream / File / etc类型对象的文件引用吗?显然,我可以将文件(在这种情况下为xml)粘贴为一个巨大的字符串,或者将其作为文件读取,但是有一个特定于Junit的快捷方式吗?

public class MyTestClass{

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

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

}

5 回答

  • 1

    您可以尝试 @Rule 注释 . 以下是文档中的示例:

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

    您只需要创建扩展 ExternalResourceFileResource 类 .

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

    如果您需要实际获取 File 对象,则可以执行以下操作:

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

    这有利于跨平台工作,如this blog post中所述 .

  • 71

    我知道你说你不想手工阅读文件,但这很容易

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

    您所要做的就是确保有问题的文件位于类路径中 . 如果您正在使用Maven,只需将文件放在src / test / resources中,Maven会在运行测试时将其包含在类路径中 . 如果你需要做很多这样的事情,你可以把打开文件的代码放在一个超类中并让你的测试继承 .

  • 13

    你可以试试:

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

    如果您想将测试资源文件加载为只包含几行代码并且没有任何额外依赖关系的字符串,则可以实现:

    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”匹配输入的开头,而且只有一个 . 因此,这将解析整个文件内容并将其作为字符串返回 . 最重要的是,它不需要任何第三方库(如IOUTils) .

相关问题