You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:29:52