尝试断言某些值时显示java.lang.UnsupportedOperationException

时间:2013-09-18 06:10:40

标签: java

我使用以下代码在我的测试脚本中断言文本。但是每次遇到这段代码时它都会给出UnsupportedOperationException错误。

public static void verifyEquals(Object actual, Object expected) {
        try {
            Assert.assertEquals(actual, expected);
        } catch(Throwable e) {
            addVerificationFailure(e);
        }
    }

    public static List<Throwable> getVerificationFailures() {
        List verificationFailures = verificationFailuresMap.get(Reporter.getCurrentTestResult());
        return verificationFailures == null ? new ArrayList() : verificationFailures;
    }

    private static void addVerificationFailure(Throwable e) {
        StackTraceElement[] error = e.getStackTrace();
        List<StackTraceElement> errors = Arrays.asList(error);
        verificationFailuresMap.put(Reporter.getCurrentTestResult(), errors);
        List verificationFailures = getVerificationFailures();
        verificationFailuresMap.put(Reporter.getCurrentTestResult(), verificationFailures);
        verificationFailures.add(e);
    }

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

这是问题所在:

List verificationFailures = getVerificationFailures();
verificationFailuresMap.put(Reporter.getCurrentTestResult(), verificationFailures);
verificationFailures.add(e);

您在List.add的结果上致电Arrays.asList。您不能这样做,因为Arrays.asList的结果是视图到数组上 - 您无法添加或删除元素。

另外 - 擦除 - 该列表是List<StackTraceElement> - 它由StackTraceElement[]支持。向{1}添加Throwable甚至意味着什么?

如果删除将列表放入地图的代码,然后在添加之前再将其取回,则更容易看到问题:

private static void addVerificationFailure(Throwable e) {
    StackTraceElement[] error = e.getStackTrace();
    List<StackTraceElement> errors = Arrays.asList(error);
    verificationFailuresMap.put(Reporter.getCurrentTestResult(), errors);
    errors.add(e);
}

由于尝试将Throwable添加到List<StackTraceElement>,现在编译时会失败。但即使您尝试添加StackTraceElement,由于Arrays.asList不支持add仍会失败。

目前还不清楚你要做什么,但你需要重新考虑一下......