使用标准考虑下面的测试案例JUnit
断言和hamcrest的assertThat
:为什么hamcrest说一个字节0不等于一个int 0?
byte b = 0;
int i = 0;
assertEquals(b, i); // success
assertThat(b, equalTo(i)); // java.lang.AssertionError: Expected: <0> but: was <0>
if (b == i) {
fail(); // test fails, so b == i is true for the JVM
}
为什么会这样呢? JVM的值显然是相等的,因为b == i
是true
,所以为什么hamcrest
失败?
因为Byte.valueOf((byte)0).equals(Integer.valueOf(0))'为false。 – assylias
如上面的* assylias *'例子所示,该字节被自动装箱成一个字节对象。如[Hamcrest的equalTo文档](http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/core/IsEqual.html#equalTo(T))所示,它使用Object1.equals(Object2)。既然byte和int都是原语,它会自动将它们装入Byte和Integer对象。字节1。等于(Integer1)将返回false,即使这些盒装对象的值是相同的。 –