JUnit-Mockito:如何正确配置Mock对象及解决初始化报错问题
解决Mockito配置的两个错误:空指针与匹配器误用
你的测试配置里犯了两个典型的Mockito使用错误,我来一步步帮你修正:
错误原因分析
1. 空指针异常(NullPointerException)
你代码里的when(eq(item).getJSON(anyString()))存在问题:
- 如果
item没有被正确Mock或者未初始化,它就是null对象,调用null.getJSON()自然会抛出NPE。 - 另外,这里完全不需要用
eq(item)包裹Mock对象,直接使用Mock的item实例即可。
2. 匹配器误用异常(InvalidUseOfMatchersException)
thenReturn(anyString())是错误的用法:
Mockito的匹配器(比如anyString()、eq())只能用在方法参数的位置(也就是when(mock.method(这里用匹配器))),不能放在thenReturn()里作为返回值。你需要传入一个具体的测试用值,而不是匹配器。
正确的Mock配置示例
首先要确保所有依赖的对象都被正确Mock,然后按步骤Stub方法:
// 先声明Mock对象,推荐用@Mock注解 @Mock private DatabaseController databaseControllerMock; @Mock private Item item; // 必须Mock这个Item对象,不然会出现NPE private ActivitiesService activitiesService; @Before public void setUp() throws Exception { // 初始化所有@Mock标注的对象 MockitoAnnotations.openMocks(this); // 实例化被测服务 activitiesService = new ActivitiesService(databaseControllerMock); // 第一步:Stub DatabaseController的get方法,让它返回我们Mock的item when(databaseControllerMock.get(anyString(), anyList())).thenReturn(item); // 第二步:Stub Item的getJSON方法,返回具体的测试用JSON字符串 // 这里替换成你测试需要的JSON内容 when(item.getJSON(anyString())).thenReturn("{\"measurements\":[{\"value\":100}]}"); }
额外注意事项
- 如果你不用
@Mock注解,也可以用Mockito.mock(Item.class)手动创建Mock对象,比如Item item = Mockito.mock(Item.class);,但注解方式更简洁。 - 确保被测方法里调用的
dbService.get()参数和你Stub时的匹配器匹配(比如用anyString()匹配任意表名,anyList()匹配任意主键列表,或者用eq("your-table-name")指定具体值)。 - 测试时尽量用真实的测试数据(比如符合格式的JSON字符串),这样能更准确地模拟实际场景。
内容的提问来源于stack exchange,提问作者D.Zet
相关产品推荐
相关产品推荐

