当前位置: 首页 > 知识库问答 >
问题:

2个不匹配字符串对象的断言/比较记录为错误,而不是失败

薛俊美
2023-03-14

我执行了一个简单的测试用例(在jobss-ejb环境中),它比较/断言2个字符串。
不幸的是,这些字符串彼此不匹配(有一个错误)。

但问题是,当我从eclipse执行测试用例时,它会将结果记录为失败,这是正确的,因为预期对象和实际对象之间存在不匹配;
而当我从ant执行相同的测试用例时,结果被记录为错误。
这真的很奇怪和令人惊讶,并且要补充更多,这种行为仅在junit4版本上被注意到,当我在junit3.8上执行测试用例时,ant和eclipse都将结果记录为失败。
关于可能出错的任何建议或指示?
提前感谢:)

Ant版本:1.6.1 Junit版本:4.10

共有2个答案

慕阳伯
2023-03-14

问题中提到的测试结果行为的差异是因为ant版本问题。对于较低版本的ant,您将获得此类行为(可能是因为较低版本的ant将ComparisonFailure视为错误而不是失败)。我在ant版本1.7.1(及更低版本)中发现了这种行为。但这个问题在最新的ant jar(即1.8.4)中得到了解决。当我在最新的ant版本上执行上述测试用例时,结果被记录为失败而非错误。因此,如果您遇到这样的问题,只需将ant jar更新到1.8.4或其他可用的最新版本。

沈凯康
2023-03-14

好的,我进一步挖掘,发现这与任何特定的应用程序服务器都没有关系。它可以在任何应用服务器上复制
只需创建一个示例(junit4)测试用例,如下所述:

@Test
public void stringTest() {
    org.junit.Assert.assertEquals("Comparing 2 string:", "abc", "xyz");
}

现在,从eclipse运行它;您将看到结果为1失败。使用ant(或maven)目标通过某个应用服务器运行相同的操作,您将得到错误结果。

在查看了日志之后,我认为这一定是因为junit4 org。朱尼特。明确肯定assertEquals(字符串消息,预期对象,实际对象)方法引发ComparisonFailure而不是AssertionError。我对此的分析是,junit4 assert()方法(org.junit.assert.assertEquals(String,Object,Object))只对字符串实例抛出ComparisonFailure。以下是组织机构代码。朱尼特。明确肯定assertEquals(junit4断言方法):

static public void assertEquals(String message, Object expected, Object actual) {
    if (expected == null && actual == null)
        return;
    if (expected != null && isEquals(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);
}

这是junit.framework.Assert.assertEquals(String, Object, Object)的代码

static public void assertEquals(String message, Object expected, Object actual) {
    if (expected == null && actual == null)
        return;
    if (expected != null && expected.equals(actual))
        return;
    failNotEquals(message, expected, actual);
}

可以观察到,在junit4 assertEquals()中,为不相等的字符串实例添加了一个额外的检查,这会对两个不相等的字符串抛出ComparisonFailure。对于所有其他不相等的对象,如Integer、Long等,调用failNotEquals()方法,该方法抛出断言错误。

有谁能帮助我理解在junit4的org中添加字符串实例检查的设计意义吗。朱尼特。明确肯定assertEquals()方法。为什么它真的被添加了,为什么只针对字符串?

 类似资料:
  • 问题内容: 我有这段代码: 它将引发不匹配的组错误。但是,如果不匹配,我想在那里添加空字符串,而不是抛出错误。我怎样才能做到这一点? 注意:我的完整代码比此示例复杂得多。但是,如果您找到更好的解决方案,如何遍历比赛并在其中添加数字,则可以共享。我的完整代码: 问题答案: 在Python 3.5之前的版本中,对Python中失败的捕获组的反向引用未使用空字符串填充。这是在bugs.python.or

  • 这里有2个测量: 正如您所见,比较两个匹配的字符串比比较两个大小相同但不匹配的字符串要快。这是非常令人不安的:在字符串比较期间,我认为python是逐字符测试字符串的,所以应该比更长,因为它需要对1进行4次测试才能进行不匹配的比较。可能比较是基于哈希的,但在这种情况下,两种比较的计时应该相同。 你知道为什么吗?

  • 题目描述 给定字符串A、B和正整数V,A的长度与B的长度相等, 请计算A中满足如下条件的最大连续子串的长度: 1、该连续子串在A和B中的位置和长度均相同。 2、该连续子串|A[i] – B[i]|之和小于等于V。其中|A[i] – B[i]|表示两个字母ASCII码之差的绝对值。 输入描述 输入为三行: 第一行为字符串A,仅包含小写字符,1 <= A.length <=1000。 第二行为字符串B

  • 既然我们可以在Javascript中使用关键字抛出任何东西,那么我们就不能直接抛出一个错误消息字符串吗? 有人知道这里面有什么陷阱吗? 让我对此添加一些背景:在JavaScript世界中,人们通常依赖参数检查而不是使用try-catch机制,因此只使用抛出致命错误是有意义的。不过,为了能够捕捉一些系统错误,我必须为我自己的错误使用一个不同的类,而不是创建错误的子类,我认为我应该只使用String。

  • 与有界通配符相关的编译器错误 Java:通配符类型不匹配导致编译错误

  • 如何将2列表ArrayList与list进行比较 ArrayList={a,b,c,d}和list lst={a,b,c,d,e} 结果:列表al={e} 我应该如何处理这个问题?由于对象不同,比较器不工作,即使设置或其他操作也不工作