AssertEquals 在 Instrumented Unit Tests 的大字符串上给出 TransactionTooLargeException

AssertEquals gives TransactionTooLargeException on big strings on Instrumented Unit Tests

我在 Android Studio 和单元测试中有一个奇怪的行为。

我正在使用大量 json 数据 (>800kb) 在 Android 上进行检测单元测试 (AndroidJUnitRunner),当我尝试断言与随机数据相等时:

assertEquals("ghgg", jsonData.toString());

它因 java.lang.RuntimeException: android.os.TransactionTooLargeException 而崩溃。

虽然不等式断言不会崩溃并通过绿色。

assertNotEquals("ghgg", jsonData.toString());

现在,如果我做同样的测试,但只是使用普通的非检测 junit,不等式断言不会像以前那样崩溃并通过绿色,并且等式断言不会通过(红色),但它不会给予例外。

assertEquals("ghgg", jsonData.toString());

为什么在仪器测试中,assertEquals 不能处理大字符串,而 assertNotEquals 可以?

我猜您只看到失败断言的行为差异?

如果是这样,这可能是由于内置 JUnit 断言的实现细节所致。

等于和不等于的失败路径不同。

Equals 创建一个 ComparisonFailure,它继续对 预期值和实际值进行一些处理。

static public void assertEquals(String message, Object expected,
        Object actual) {
    if (equalsRegardingNull(expected, actual)) {
        return;
    } else if (expected instanceof String && actual instanceof String) {
        String cleanMessage = message == null ? "" : message;
        throw new ComparisonFailure(cleanMessage, (String) expected,
                (String) actual);
    } else {
        failNotEquals(message, expected, actual);
    }
}

虽然不等于使用实际值生成失败消息。

static public void assertNotEquals(String message, Object unexpected,
    Object actual) {
  if (equalsRegardingNull(unexpected, actual)) {
      failEquals(message, actual);
  }
}

private static void failEquals(String message, Object actual) {
  String formatted = "Values should be different. ";
  if (message != null) {
      formatted = message + ". ";
  }

  formatted += "Actual: " + actual;
  fail(formatted);
}

junit 4.12 也是如此。对于较早的 and/or 较新的版本可能并非如此。