【发布时间】:2025-12-16 01:40:02
【问题描述】:
通过一个非常简单的 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
【问题讨论】:
标签: java mockito java-7 type-erasure java-6