JUnit - assertSame - PullRequest
       12

JUnit - assertSame

23 голосов
/ 21 мая 2010

Может кто-нибудь сказать мне, почему 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.

Ответы [ 2 ]

45 голосов
/ 21 мая 2010

Причиной является автобокс 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)

вместо этого. Этот метод использует метод equals() из Object.

12 голосов
/ 21 мая 2010

assertSame принимает два Object аргумента, поэтому компилятор должен автоматически вставить ваши int литералы в Integer.

Это эквивалентно

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

Теперь для значений от -128 до 127 JVM будет кэшировать результаты Integer.valueOf, поэтому каждый раз вы возвращаете один и тот же объект Integer. Для значений за пределами этого диапазона вы получаете новые объекты обратно.

Так что для assertSame(127, 127) JUnit сравнивает одни и те же объекты, следовательно, это работает. Для assertSame(128, 128) вы получаете разные объекты, поэтому он терпит неудачу.

Еще одна причина быть осторожным с автобоксом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...