24

Can someone tell me why assertSame() do fail when I use values > 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!
        }

I'm using JUnit 4.8.1.

4

2 回答 2

47

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

public static void assertSame(Object expected, Object actual)

它仅适用于对象。当你将ints 传递给这个方法时,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()方法 from Object

于 2010-05-21T13:28:31.943 回答
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),你得到不同的对象,所以它失败了。

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

于 2010-05-21T13:29:32.607 回答