当我使用值>时,有人能告诉我为什么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。
答案 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)
,您会得到不同的对象,因此失败。
另一个小心自动装箱的原因。