2

特定のパターンについてファイルを解析するAPIを単体テストしたいと思います。
返されるテキストの断片は、複数行であり、タブなどが含まれている場合があります。つまり、ファイル内のテキストは、ユーザーが読み取れるように新しい行とタブでフォーマットされます(xmlファイルを適切にインデントするのと同じです)。
問題:Javaそのような文字列を定義するオプションが提供されていないため(API出力のチェックで期待される結果になりますAssert)、そのような問題はどのように処理されますか?
たとえば、予想されるすべての出力を、予想される各フラグメントの開始と終了を示す特殊文字を含むファイルに保存することを考えましたが、このような問題には標準的なアプローチがあるのではないかと思いました。
より良いオプションはありますか?

更新: 例:

This is an example String.    
     This is an inner part of the string.        Another part.           Another also.    
                      This is also an inner part.   
     Now an outer.   This is the outer example       string.
4

3 に答える 3

3

更新: @ Code-Guruの回答に基づく(明白なことを言ったことを称賛します):インラインルートに移動したい場合は、Eclipseがリテラルを正しく挿入して自動エスケープするように簡単に作成できます:Windows-> Preferences- >Java->エディタ->入力->リテラルを貼り付けるときにテキストをエスケープします

残念なことに、JavaにはScalaやGroovyのような複数行の文字列がありません。

私が見つけた最善の解決策は、クラスパスにテキストファイルを配置して、

getClass().getResourceAsStream("filename");
//Then convert to string.

filenameこれにより、クラスに関連するクラスパスから名前が付けられたファイルがロードされますgetClass()(つまり、同じパッケージ内にあります)。

ここで私の要点を使用できます:https ://gist.github.com/4041855これは、Guavaを使用して、クラスパスから文字列としてファイルを簡単にロードできるようにし、セクシーなキャッシュを実行します。

MavenまたはGradleを使用している場合は、これらのファイルを配置するのでsrc/test/resourcesはなく、配置する必要がありますsrc/test/java

多くのファイルを作成したくない場合は、明らかに文字列(つまり、XML)の解析を行うことができます。もう1つのやややり過ぎのオプションは、読み取り専用のSQLiteデータベースまたはCSVを作成することです。私は人々が彼らがテストしたい何千もの異なるパラメータを持っているならそれをするのを見ました。それが問題である場合は、JUnitパラメーター化テストをグーグルで検索する必要があります。

于 2012-11-08T21:40:14.113 に答える
2

Javaがコードで「複数行」の文字列を許可しないという事実がどのように問題になるのかわかりません。'\n'および'\t'文字を含む文字列と比較できるはずです。これらの「予期される」文字列がテストでハードコーディングされているか、入力ファイルからのものであるかは、テストスイートの設計上の決定事項です。

于 2012-11-08T22:00:17.407 に答える
0

@Adam Gentの提案をバックアップし、リソースを文字列に読み込むためのサンプルコードを追加します。

final InputStream is = StringFromFile.class.getResourceAsStream("data.txt");
final byte[] b = new byte[is.available()];
is.read(b);
System.out.println(new String(b, "UTF-8"));

書式設定プレースホルダー(%s、%dなど)を埋め込んでから、String.formatを使用してそれらを実際の値に置き換えることができます。

すべての文字列を含む単一のファイルが必要な場合は、xmlファイルを維持できます。

<strings>
    <string name="error 1"><![CDATA[Multiline
error
message 1]]></string>
    <string name="error 2"><![CDATA[Multiline
error
message 2]]></string>
    <string name="error 3"><![CDATA[Multiline
error
message 3]]></string>
</strings>

そしてそれをマップにインポートします-map.get(name);で呼び出すことができます。

ここに似たようなものの例を見つけることができます

于 2012-11-08T21:57:24.583 に答える