我使用一个非常简单的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
initMocks()
和@RunWith
两者并用的提示,并正式提出了这个问题。 - andyb