JUnit - assertSame

2022-09-01 20:02:32

有人能告诉我为什么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。


答案 1

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

public static void assertSame(Object expected, Object actual)

它仅适用于对象。将 s 传递给此方法时,Java 会自动调用int

Integer.valueOf( int i )

具有这些值。所以演员阵容没有影响。int

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

您应该使用以下方法:

public static void assertEquals(Object expected, Object actual)

相反。此方法使用 中的方法。equals()Object


答案 2

assertSame接受两个参数,因此编译器必须将文本自动框入 .ObjectintInteger

这等效于

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

现在,对于介于 -128 和 127 之间的值,JVM 将缓存 的结果,因此您每次都会取回相同的对象。对于超出该范围的值,可以取回新对象。Integer.valueOfInteger

所以对于 ,JUnit 正在比较相同的对象,因此它是有效的。对于 ,你会得到不同的对象,所以它失败了。assertSame(127, 127)assertSame(128, 128)

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


推荐