Java Junit+;URL解码器:为什么这个测试失败?

Java Junit+;URL解码器:为什么这个测试失败?,java,junit,urldecode,Java,Junit,Urldecode,我的一个测试中有以下代码。第二个断言失败 String decode1 = URLDecoder.decode("a%20b", "UTF-8"); assertTrue("a b".equals(decode1)); // pass assertEquals("a‌ b", decode1); // FAIL 我不明白为什么。这是JUnit的bug吗?您可能会认为,如果第一个参数不是null,JUnit只会调用.equals()。它确实调用了equals()。看看这个例子,我们有以下几点。

我的一个测试中有以下代码。第二个断言失败

String decode1 = URLDecoder.decode("a%20b", "UTF-8");

assertTrue("a b".equals(decode1)); // pass
assertEquals("a‌ b", decode1); // FAIL
我不明白为什么。这是JUnit的bug吗?您可能会认为,如果第一个参数不是null,JUnit只会调用.equals()。

它确实调用了equals()。看看这个例子,我们有以下几点。(您没有说您使用的是JUnit3.8还是4.0,但我很确定他们没有改变这种基本功能的实现

public static void assertEquals(String   msg, Object   obj1, Object   obj2) {

        if (obj1 == null && obj2 == null) {
          return;
        }

        if (obj1 != null && obj1.equals(obj2)) {
          return;
        }

        fail(msg + " expected=" + obj1 + " actual=" + obj2);
}
你是否100%确定一个迷路的编码字符没有潜入你的测试。也许试试这个排除它

String expected = "a b";
assertTrue(expected.equals(decode1)); 
assertEquals(expected, decode1); 

当我将您的代码粘贴到新测试中时,正如您所说,它失败了。但是,在删除最后的“a b”字符串并重新键入后,它通过了。您必须在其中嵌入一些我在查看此页面源代码时看不到的字符

失败的断言说明了这一点,即预期值为

"a[ ]b"

第二个“a b”字符串中有一个非打印字符。