Java 如何单元测试双向文本处理
我正在尝试为一些字符串格式代码编写单元测试。格式化输出在某些情况下可能包含双向文本,即从左到右和从右到左的混合 我已经通过经验验证,在Android设备或模拟器上运行时,对于LTR和RTL输入和输出的所有组合,输出看起来都是正确的。不过,我正努力在单元测试中捕捉到这一点;我不确定如何在测试用例中正确指定预期的输出 例如,我想断言返回的字符串将如下呈现:Java 如何单元测试双向文本处理,java,android,unicode,junit,bidi,Java,Android,Unicode,Junit,Bidi,我正在尝试为一些字符串格式代码编写单元测试。格式化输出在某些情况下可能包含双向文本,即从左到右和从右到左的混合 我已经通过经验验证,在Android设备或模拟器上运行时,对于LTR和RTL输入和输出的所有组合,输出看起来都是正确的。不过,我正努力在单元测试中捕捉到这一点;我不确定如何在测试用例中正确指定预期的输出 例如,我想断言返回的字符串将如下呈现: assertEquals("-د.ك.123,456.78", formattedOutput); -د.ك.123456.78 也就是说,图
assertEquals("-د.ك.123,456.78", formattedOutput);
-د.ك.123456.78
也就是说,图示符应按从左到右的顺序显示:
-
1
2
3
,
4
5
6
7
8
ك
د
(你不知道在SO编辑框中将其编辑成正确的序列有多困难!)
我在测试用例中尝试过使用标准字符串比较方法,如下所示:
assertEquals("-د.ك.123,456.78", formattedOutput);
但这失败了,因为测试代码中的预期输出字符串正在对其文本进行重新排序。事实上,它在源代码中的表现甚至有所不同,这取决于我使用哪个工具查看源代码(Android Studio与使用Chrome的Github),因此我不相信它测试的是正确的
我还尝试过分步构建预期的输出值,以避免编辑器中出现混乱,尽管这会导致在后台构建相同的字符串文字:
assertEquals("-123,456.78" + SYMBOL, formattedOutput);
如何比较图示符的视觉顺序,而不是逻辑顺序?Android的
BidiFormatter
能帮我吗?一个典型的assertEquals
对该字符串和返回相同字符串(即新字符串对象)的方法对我来说很好,使用IntelliJ 14.0.3 Ultimate,UTF-8为实际文本文件设置
同样有效的方法以及您可以尝试的方法是获取要比较的字符串字节(可能手动指定特定编码),然后使用assertArrayEquals
将返回的字节数组彼此比较。我不明白为什么使用手动设置的编码来获取字符串的字节是行不通的,至少是这样
如果您愿意,您可以查看此页面以获取灵感:也许前面的答案可以帮助您:您可以展示如何构建formattedOutput吗?另外,您可以展示失败断言的输出吗?(即,显示导致断言失败的formattedOutput的值)