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

使用Mockito when then打桩时Mock方法未返回预期值且报UnnecessaryStubbingException

问题根因
  • 重复初始化Mockito上下文:测试类同时使用了@RunWith(MockitoJUnitRunner.class)和@Before方法中的MockitoAnnotations.initMocks(this),两者功能完全重复,执行后会导致打桩的DocumentService实例和实际注入到DocumentController中的实例不一致,你定义的打桩逻辑从未被调用,因此Mockito判定该打桩为冗余代码,抛出UnnecessaryStubbingException。
  • 断言逻辑无效:现有测试中的assertEquals(jsonResponse, jsonResponse)是同一个对象的自我对比,完全无法验证返回结果的正确性。
  • Mockito 2.x默认开启严格Stub检查,只要存在未被调用的打桩逻辑就会直接抛出异常终止测试,这也是你看不到预期返回值的直接原因。
修复方案
  1. 移除重复的Mockito初始化逻辑,二选一即可:
    • 保留类上的@RunWith(MockitoJUnitRunner.class)注解,删除整个setUp方法
    • 删除类上的@RunWith(MockitoJUnitRunner.class)注解,保留setUp中的初始化代码
  2. 修正断言逻辑,将接口返回的JSON字符串和预期对象序列化后的结果做对比
  3. 可选:如果确实存在需要保留未使用打桩的特殊场景,可以将类注解替换为@RunWith(MockitoJUnitRunner.Silent.class)关闭严格检查,该方案不推荐优先使用。

修复后完整测试类示例

@RunWith(MockitoJUnitRunner.class)
public class DocumentControllerTest extends TestCase {
    
    @Mock
    DocumentService documentService;
    
    @InjectMocks
    DocumentController documentController;

    /**
     * Test method to verify the functionality of createDocumnet controller method.
     */
    @Test
    public void createDocumentTest () {
        String documentInfo = "testInfo";
        JsonResponse jsonResp = new JsonResponse();
        jsonResp.setMessage("OK");
        jsonResp.setStatus("OK");
        jsonResp.setSuccess(true);
        Mockito.when(documentService.createDocument(documentInfo)).thenReturn(jsonResp);
        
        String actualJsonResponse = documentController.create(documentInfo);
        String expectedJsonResponse = new Gson().toJson(jsonResp);
        System.out.println(actualJsonResponse);
        assertEquals(expectedJsonResponse, actualJsonResponse);
    }
}

内容的提问来源于stack exchange,提问作者Aamir Sheraz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:48:01