@InjectMocks ведет себя по-разному с Java 6 и 7

С очень простым Mockito, запускающим тест JUnit и класс, я вижу разные результаты, когда тест выполняется с Java 1.6.0_32 и Java 1.7.0_04, и хочу понять почемуэто происходит. Я подозреваю, что происходит какое-то стирание типа, но хотелось бы окончательного ответа.

Вот мой пример кода и инструкции по запуску из командной строки:

FooServiceTest.java

import org.junit.*;
import org.junit.runner.*;
import org.mockito.*;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
import java.util.*;

@RunWith(MockitoJUnitRunner.class)
public class FooServiceTest {
  @Mock Map mockStringString;
  @Mock Map mockStringInteger;

  @InjectMocks FooService fooService;

  public static void main(String[] args) {
    new JUnitCore().run(FooServiceTest.class);
  }

  @Before
  public void setup() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void checkInjection() {
    when(mockStringString.get("foo")).thenReturn("bar");
    fooService.println();
  }
}

FooService.java

import java.util.*;

public class FooService {
  private Map stringString = new HashMap();
  private Map stringInteger = new HashMap();

  public void println() {
    System.out.println(stringString.get("foo") + " " + stringInteger);
  }
}

Чтобы скомпилировать и запустить этот пример:

  • сохраните вышеуказанное в файлы
  • загрузите и поместите в тот же каталог junit.4.10.jar и mockito-all-1.9.0.jar
  • установите PATH для включения JDK
  • скомпилируйте с javac -cp junit-4.10.jar;mockito-all-1.9.0.jar *.java
  • запускать с java -cp .;junit-4.10.jar;mockito-all-1.9.0.jar FooServiceTest

Я полагаю, что вышеприведенный вывод будет null {}, потому что @InjectMocksвнедрение поля не может правильно разрешить типы, поскольку они оба относятся к типу Map. Это правильно?

Теперь изменение одного из фиктивных имен для соответствия полю в классе должно позволить Mockito найти совпадение. Например, изменение

@Mock Map mockStringInteger;

на

@Mock Map stringInteger;

, а затем компиляция/запуск с Java 1.6.0_32 дает (IMHO ожидаемый) вывод bar stringInteger, но с 1.7.0_04 дает null stringInteger.

Вот как я его запускаю (из командной строки в Windows 7):

E:\src\mockito-test>set PATH="C:\Program Files (x86)\Java\jdk1.6.0_32\bin"
E:\src\mockito-test>javac -cp junit-4.10.jar;mockito-all-1.9.0.jar *.java
E:\src\mockito-test>java -cp .;junit-4.10.jar;mockito-all-1.9.0.jar FooServiceTest
    bar stringInteger
E:\src\mockito-test>set PATH="C:\Program Files (x86)\Java\jdk1.7.0_04\bin"
E:\src\mockito-test>javac -cp junit-4.10.jar;mockito-all-1.9.0.jar *.java
E:\src\mockito-test>java -cp .;junit-4.10.jar;mockito-all-1.9.0.jar FooServiceTest
    null stringInteger

11
задан andyb 2 July 2012 в 08:50
поделиться