2

我想对解析文件以获取特定模式的 API 进行单元测试。
返回的文本片段可能是多行的并包含制表符等。即文件中的文本被格式化为新行和制表符以供用户阅读(就像我们很好地缩进一个 xml 文件一样)。
问题:由于Java不提供定义此类字符串的选项(这将是Assert检查 API 输出的预期结果),如何处理此类问题?
我想例如将所有预期的输出保存在一个带有某种特殊字符的文件中,以标记每个预期片段的开始和结束,但我认为也许有一个标准的方法来解决这个问题。
有更好的选择吗?

更新: 示例:

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->Editor->Typing->粘贴文字时转义文本

令人遗憾的是,Java 没有像 Scala 或 Groovy 这样的多行字符串。

我发现的最佳解决方案是将文本文件放在您的类路径中并执行

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

这将加载filename从相对于getClass()类的类路径命名的文件(即在同一个包中)。

您可以在这里使用我的要点:https : //gist.github.com/4041855,它使用 Guava 可以更轻松地将文件作为字符串从类路径加载并进行一些性感的缓存。

如果您使用MavenGradle,您将希望将这些文件放入src/test/resources而不是src/test/java.

如果您不想制作很多文件,您显然可以对字符串(即 XML)进行一些解析。另一个稍微有点矫枉过正的选择是制作一个只读的 SQLite 数据库甚至是 CSV。我见过有人这样做,如果他们想要测试 1000 多个不同的参数。如果那是你的问题,你应该谷歌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 回答