JUnit - assertSame

时间:2010-05-21 13:15:14

标签: java unit-testing junit junit4

当我使用值>时,有人能告诉我为什么assertSame()失败了127?

        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。

2 个答案:

答案 0 :(得分:45)

原因是Java的自动装箱。 您使用以下方法:

public static void assertSame(Object expected, Object actual)

它只适用于Objects。将int传递给此方法时,Java会自动调用

Integer.valueOf( int i )

有这些值。因此,对int的强制转换无效。

对于小于128的值,Java具有缓存,因此assertSame()Integer对象与其自身进行比较。对于大于127的值,Java会创建新实例,因此assertSame()会将Integer对象与另一个对象进行比较。因为它们不是同一个实例,所以assertSame()方法返回false。

您应该使用以下方法:

public static void assertEquals(Object expected, Object actual)

代替。此方法使用equals()中的Object方法。

答案 1 :(得分:12)

assertSame需要两个Object个参数,因此编译器必须将int个文字自动装入Integer

这相当于

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

现在,对于介于-128和127之间的值,JVM将缓存Integer.valueOf的结果,因此每次都会返回相同的Integer对象。对于该范围之外的值,您将获得新对象。

因此对于assertSame(127, 127),JUnit正在比较相同的对象,因此它可以工作。对于assertSame(128, 128),您会得到不同的对象,因此失败。

另一个小心自动装箱的原因。