使用標準考慮下面的測試案例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,即使這些盒裝對象的值是相同的。 –