2010-05-21 24 views
23

Birisi,> 127 değerlerini kullandığımda assertSame() öğesinin neden başarısız olduğunu söyleyebilir mi?JUnit - assertSame

 import static org.junit.Assert.*; 

     ... 

     @Test 
     public void StationTest1() { 
      .. 

      assertSame(4, 4);   // OK 
      assertSame(10, 10);  // OK 
      assertSame(100, 100);  // OK 
      assertSame(127, 127);  // OK 
      assertSame(128, 128);   // raises an junit.framework.AssertionFailedError! 
      assertSame(((int) 128),((int) 128)); // also junit.framework.AssertionFailedError! 
     } 

JUnit 4.8.1 kullanıyorum.

+3

'assertSame 'öğesini yalnızca referans eşitlik kontrolleri için kullanmalısınız - örneğin" a == b ". Eşitlik için, 'assertEquals' kullanmalısınız. –

cevap

44

Nedeni, Java'nın otomatik kutusu. Sadece Nesneler ile çalışır

public static void assertSame(Object expected, Object actual) 

: Sen yöntemini kullanın. Bu yönteme int s geçirdiğinizde, Java otomatik olarak bu değerlerle

Integer.valueOf(int i) 

çağırır. Bu nedenle int'a yapılan yayının etkisi yok.

128'den daha düşük değerler için Java'nın bir önbelleği vardır, bu nedenle assertSame(), Integer nesnesini kendisi ile karşılaştırır. 127'den büyük değerler için Java yeni örnekler oluşturur, bu nedenle assertSame(), bir Integer nesnesini diğeriyle karşılaştırır. Aynı örnek olmadığından, assertSame() yöntemi yanlış döndürür. yerine

public static void assertEquals(Object expected, Object actual) 

:

Sen yöntemi kullanmalısınız. Bu yöntem, Object'dan equals() yöntemini kullanır.

+0

JVM * önbelleğinin -128..127 olmasını, ancak bu aralığın dışındaki değerler için, JVM uygulamasının tümüyle önbelleğe aldığı aralıkta olduğu doğrudur, \t _ "Daha az bellek sınırlı uygulamalar, örneğin -32K ila + 32K aralığındaki tüm char ve kısa değerlerin yanı sıra int ve long değerlerini önbelleğe alın. "_ http://docs.oracle.com/javase/specs/jls/se7/html/jls-5 .html # jls-5.1.7 https://stackoverflow.com/questions/20897020/why-integer-class-caching-values-in-the-range-128-to-127/20948389#20948389 – weston

12

assertSame, iki Object argümanını alır ve derleyici öğelerinizi Integer içine otomatik kutuya kaydetmelidir. Eğer tekrar aynı Integer nesne her zaman olsun böylece

Bu -128 ile 127 arasındaki değerler için Şimdi

assertSame(Integer.valueOf(128), Integer.valueOf(128)); 

eşdeğerdir, JVM, Integer.valueOf sonuçlarını önbelleğe alır. Bu aralığın dışındaki değerler için, yeni nesneler geri alırsınız.

0Uiçin, JUnit aynı nesneleri karşılaştırır, dolayısıyla çalışır. assertSame(128, 128) için farklı nesneler alırsınız, bu yüzden başarısız olur.

Otomatik kutulamaya dikkat etmenin bir başka nedeni.

+0

Doğru JVM'nin önbellek -128..127 olması gerekir, ancak bu aralığın dışındaki değerler için, bu tamamen JVM uygulamasının önbelleğe alındığı aralıktadır, _ "Daha az bellek sınırlı uygulamalar, örneğin, tüm karakterleri ve kısa değerleri önbelleğe alabilir, -32K ila + 32K aralığında int ve uzun değerlerin yanı sıra. "_ http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 üzerinden https://stackoverflow.com/a/20948389/360211 – weston