我有以下方法,它将字符串截断为特定大小的字节:
public class Utils {
public static String trimStringToBytesSize(String s, int length) {
if (s == null || length < 0) return null;
int trimLength = Math.min(length, s.length());
String trimmedString = s;
while (trimmedString.getBytes().length > length && trimLength >= 0) {
trimmedString = s.substring(0, trimLength);
trimLength--;
}
return trimmedString;
}
}
我为它写了一些测试:
@Test
public void trimStringToBytesSize() {
[...]
trimStringToBytesSizeTestLogic("Шалом",
6,
"Шал"
);
[...]
}
private void trimStringToBytesSizeTestLogic(final String input, final int
stringLength, final String expectedResult) {
final String actRes = Utils.trimStringToBytesSize(input, stringLength);
Assert.assertEquals(expectedResult, actRes);
}
该测试在 IntelliJ Idea 中运行良好。但是,当我在 Gradle 中运行它时它失败了。错误是这样的:
org.junit.ComparisonFailure: expected:<Шал[]> but was:<Шал[ом]>
显然,它与字节大小有关。
我试图在一个包含方法和测试的最小项目中重现该问题。代码是一样的,但是这个最小的项目中没有出现在原始代码中出现的问题。
我试图找出它们之间的区别,并比较了最小和原始项目中的编码。根据 Notepad++ (UTF-8),它们是相同的。
还有什么可能导致此测试失败?我该如何解决?
注意:我使用的是 Java 1.8 和 Gradle 2.14(由于客户的要求,我无法升级到更新的版本)。