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

时间:2016-11-02 17:09:43

标签: java android unit-testing junit android-testing

我对Android Studio和单元测试有一种奇怪的行为。

我在Android上使用大型json数据(> 800kb)进行检测单元测试(for function in [f_1, f_2]: ... x = function()[0] # Works for f_1, breaks for f_2 y = function() # Works for f_2, assigns (3, 4) for f_1 while # we really would like only the 3 to be the # assigned value ),当我尝试断言与随机数据相等时:

AndroidJUnitRunner

它与assertEquals("ghgg", jsonData.toString()); 崩溃。

虽然不平等断言不会崩溃并传递绿色。

java.lang.RuntimeException: android.os.TransactionTooLargeException

现在,如果我进行相同的测试,但只使用普通的非检测junit,不等式断言不会崩溃并像以前一样传递绿色,并且相等断言不会传递(红色),但它不会给出异常

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

如果进行检测测试,assertEquals("ghgg", jsonData.toString()); 无法处理大字符串,assertEquals可以吗?

1 个答案:

答案 0 :(得分:0)

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

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

失败路径对于equals而不是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也是如此。对于早期版本和/或更晚版本,情况可能并非如此。