通过一个非常简单的 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<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 编译/运行会给出(恕我直言是预期的)输出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