С очень простым Mockito, запускающим тест JUnit и класс, я вижу разные результаты, когда тест выполняется с Java 1.6.0_32 и Java 1.7.0_04, и хочу понять почемуэто происходит. Я подозреваю, что происходит какое-то стирание типа, но хотелось бы окончательного ответа.
Вот мой пример кода и инструкции по запуску из командной строки:
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();
}
}
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);
}
}
Чтобы скомпилировать и запустить этот пример:
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