JUnit - assertSame

Mic*_* W. 23 java junit unit-testing junit4

当有人使用值> 127时,有人能告诉我为什么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!
        }
Run Code Online (Sandbox Code Playgroud)

我正在使用JUnit 4.8.1.

Dan*_*ann 45

原因是Java的自动装箱.您使用的方法:

public static void assertSame(Object expected, Object actual)
Run Code Online (Sandbox Code Playgroud)

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

Integer.valueOf( int i )
Run Code Online (Sandbox Code Playgroud)

有这些价值观.所以演员表int没有效果.

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

你应该使用这个方法:

public static void assertEquals(Object expected, Object actual)
Run Code Online (Sandbox Code Playgroud)

代替.此方法使用equals()方法Object.


ska*_*man 12

assertSame有两个Object参数,因此编译器必须将您的int文字自动装入Integer.

这相当于

assertSame(Integer.valueOf(128), Integer.valueOf(128));
Run Code Online (Sandbox Code Playgroud)

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

因此assertSame(127, 127),JUnit正在比较相同的对象,因此它可以工作.因为assertSame(128, 128),你得到不同的对象,所以它失败了.

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