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!
}
JUnit4.8.1を使用しています。
その理由は、Javaのオートボクシングです。次の方法を使用します。
_public static void assertSame(Object expected, Object actual)
_
オブジェクトでのみ機能します。このメソッドにint
sを渡すと、Javaは自動的に呼び出します
_Integer.valueOf( int i )
_
これらの値で。したがって、int
へのキャストは効果がありません。
128未満の値の場合Javaにはキャッシュがあるため、assertSame()
はInteger
オブジェクトをそれ自体と比較します。127より大きい値の場合Javaは新しいインスタンスを作成するため、assertSame()
はInteger
オブジェクトを別のオブジェクトと比較します。これらは同じインスタンスではないため、assertSame()
メソッドはfalseを返します。
次の方法を使用する必要があります。
_public static void assertEquals(Object expected, Object actual)
_
代わりに。このメソッドは、Object
のequals()
メソッドを使用します。
assertSame
は2つのObject
引数を取るため、コンパイラはint
リテラルをInteger
に自動ボックス化する必要があります。
これは同等です
_assertSame(Integer.valueOf(128), Integer.valueOf(128));
_
-128〜127の値の場合、JVMは_Integer.valueOf
_の結果をキャッシュするため、毎回同じInteger
オブジェクトが返されます。その範囲外の値の場合、新しいオブジェクトが返されます。
したがって、assertSame(127, 127)
の場合、JUnitは同じオブジェクトを比較しているため、機能します。 assertSame(128, 128)
の場合、異なるオブジェクトを取得するため、失敗します。
オートボクシングに注意するもう1つの理由。