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),你得到不同的对象,所以它失败了.
另一个小心自动装箱的原因.
| 归档时间: |
|
| 查看次数: |
20178 次 |
| 最近记录: |