С очень простым Mockito запускают JUnit test и класс. Я вижу другой вывод, когда тест выполняется с 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<String, String> mockStringString;
@Mock Map<String, Integer> 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<String, String> stringString = new HashMap<String, String>();
private Map<String, Integer> stringInteger = new HashMap<String, Integer>();
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<String, Integer> mockStringInteger;
к
@Mock Map<String, Integer> 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