5

我正在尝试为一些字符串格式代码编写单元测试。在某些情况下,格式化输出可能包含双向文本,即从左到右和从右到左的混合。

我已经根据经验验证了在 Android 设备或模拟器上运行时,对于 LTR 和 RTL 输入和输出的所有组合,输出看起来都是正确的。不过,我正在努力在单元测试中捕捉到这一点;我不确定如何在我的测试用例中正确指定预期的输出。

例如,我想断言返回的字符串将呈现如下:

-د.ك.123,456.78

也就是说,字形应该按照从左到右的顺序出现:

-

1

2

3

,

4

5

6

.

7

8

.

ك

.

د

(你不知道在 SO 编辑框中将其编辑成正确的序列有多难!)

我尝试在测试用例中使用标准字符串比较方法,如下所示:

assertEquals("-د.ك.123,456.78", formattedOutput);

但这失败了,因为测试代码中的预期输出字符串正在对其文本进行重新排序。事实上,根据我用来查看源代码的工具(Android Studio vs. Github-with-Chrome),它在源代码中的表现甚至有所不同,所以我不相信它正在测试正确的东西。

我还尝试逐步构建预期输出值,以避免在编辑器中造成混淆,尽管它会导致在引擎盖下构造相同的字符串文字:

assertEquals("-123,456.78" + SYMBOL, formattedOutput);

如何比较字形的视觉顺序,而不是逻辑顺序?Android会BidiFormatter在这里帮助我吗?

4

1 回答 1

0

使用 IntelliJ 14.0.3 Ultimate,为实际文本文件设置的 UTF-8,该字符串上的典型值assertEquals和返回相同字符串(即新的 String 对象)的方法对我来说很好。

什么也有效,你可以尝试什么,是获取你想要比较的字符串的字节(可能手动指定一个特定的编码),然后将返回的字节数组相互比较,使用assertArrayEquals. 我不明白为什么使用手动设置的编码获取字符串的字节至少不起作用。

如果您愿意,可以查看此页面以获取灵感:https ://docs.oracle.com/javase/tutorial/i18n/text/string.html

于 2015-04-12T00:56:14.767 回答