web-dev-qa-db-ja.com

テキストファイルリソースをJavaユニットテストに読み込む方法

src/test/resources/abc.xmlにあるXMLファイルを操作する必要がある単体テストがあります。ファイルの内容をStringに入れる最も簡単な方法は何ですか?

178
yegor256

Apache Commons のおかげで、最後にきちんとした解決策を見つけました。

package com.example;
import org.Apache.commons.io.IOUtils;
public class FooTest {
  @Test 
  public void shouldWork() throws Exception {
    String xml = IOUtils.toString(
      this.getClass().getResourceAsStream("abc.xml"),
      "UTF-8"
    );
  }
}

完全に動作します。ファイルsrc/test/resources/com/example/abc.xmlがロードされています(Mavenを使用しています)。

"abc.xml"をたとえば"/foo/test.xml"に置き換えると、このリソースがロードされます:src/test/resources/foo/test.xml

Cactoos を使用することもできます。

package com.example;
import org.cactoos.io.ResourceOf;
import org.cactoos.io.TextOf;
public class FooTest {
  @Test 
  public void shouldWork() throws Exception {
    String xml = new TextOf(
      new ResourceOf("/com/example/abc.xml") // absolute path always!
    ).asString();
  }
}
189
yegor256

ポイントに右:

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("file/test.xml").getFile());
92
pablo.vix

ファイル内のUTF8エンコーディングを想定します-そうでない場合は、「UTF8」引数を省略し、それぞれの場合に基礎となるオペレーティングシステムのデフォルトの文字セットを使用します。

JSE 6の簡単な方法-シンプルでサードパーティライブラリなし!

import Java.io.File;
public class FooTest {
  @Test public void readXMLToString() throws Exception {
        Java.net.URL url = MyClass.class.getResource("test/resources/abc.xml");
        //Z means: "The end of the input but for the final terminator, if any"
        String xml = new Java.util.Scanner(new File(url.toURI()),"UTF8").useDelimiter("\\Z").next();
  }
}

JSE 7(将来)の簡単な方法

public class FooTest {
  @Test public void readXMLToString() throws Exception {
        Java.net.URL url = MyClass.class.getResource("test/resources/abc.xml");
        Java.nio.file.Path resPath = Java.nio.file.Paths.get(url.toURI());
        String xml = new String(Java.nio.file.Files.readAllBytes(resPath), "UTF8"); 
  }

どちらも巨大なファイルを対象とはしていません。

51
Glen Best

最初にabc.xmlが出力ディレクトリにコピーされていることを確認してください。次に、getResourceAsStream()を使用する必要があります。

InputStream inputStream = 
    Thread.currentThread().getContextClassLoader().getResourceAsStream("test/resources/abc.xml");

InputStreamを取得したら、それを文字列に変換するだけです。このリソースには、 http://www.kodejava.org/examples/266.html と記述されています。ただし、関連するコードを抜粋します。

public String convertStreamToString(InputStream is) throws IOException {
    if (is != null) {
        Writer writer = new StringWriter();

        char[] buffer = new char[1024];
        try {
            Reader reader = new BufferedReader(
                    new InputStreamReader(is, "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        return writer.toString();
    } else {        
        return "";
    }
}
13
Kirk Woll

Google Guavaを使用すると:

import com.google.common.base.Charsets;
import com.google.common.io.Resources;

public String readResource(final String fileName, Charset charset) throws Exception {
        try {
            return Resources.toString(Resources.getResource(fileName), charset);
        } catch (IOException e) {
            throw new IllegalArgumentException(e);
        }
}

例:

String fixture = this.readResource("filename.txt", Charsets.UTF_8)
7
Datageek

あなたはやってみることができます:

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

Junitルールを使用して、テスト用にこの一時フォルダーを作成できます。

@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); File file = temporaryFolder.newFile(".src/test/resources/abc.xml");

1
IgorGanapolsky

以下は、テキスト付きのテキストファイルを取得するために使用したものです。コモンズのIOUtilsとグアバのリソースを使用しました。

public static String getString(String path) throws IOException {
    try (InputStream stream = Resources.getResource(path).openStream()) {
        return IOUtils.toString(stream);
    }
}
1
ikryvorotenko