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

