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”字符串中有一个非打印字符。