web-dev-qa-db-ja.com

JUnit-assertSame

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を使用しています。

23
Michael W.

その理由は、Javaのオートボクシングです。次の方法を使用します。

_public static void assertSame(Object expected, Object actual)
_

オブジェクトでのみ機能します。このメソッドにintsを渡すと、Javaは自動的に呼び出します

_Integer.valueOf( int i )
_

これらの値で。したがって、intへのキャストは効果がありません。

128未満の値の場合Javaにはキャッシュがあるため、assertSame()Integerオブジェクトをそれ自体と比較します。127より大きい値の場合Javaは新しいインスタンスを作成するため、assertSame()Integerオブジェクトを別のオブジェクトと比較します。これらは同じインスタンスではないため、assertSame()メソッドはfalseを返します。

次の方法を使用する必要があります。

_public static void assertEquals(Object expected, Object actual)
_

代わりに。このメソッドは、Objectequals()メソッドを使用します。

45
Daniel Engmann

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つの理由。

12
skaffman