在 java 单元测试中,mockito 的 strict stubbing(严格模式)通过 lenient() 或 strictness.strict_stubs 来配置。默认情况下,mockito 允许未使用的 stub 存在而不报错,但开启严格模式后,任何被定义但未在测试执行期间调用的 mock 方法都会导致测试失败。这有助于清理冗余代码并确保测试逻辑的完整性。

如何启用 Strictness.STRICT_STUBS 并处理异常
要启用严格模式,需要在测试类上使用 @MockitoSettings(strictness = Strictness.STRICT_STUBS) 注解。当测试运行结束时,Mockito 会检查所有 mock 对象,如果发现有 stub 未被调用,将抛出 UnnecessaryStubbingException。开发者可以通过捕获该异常或在 IDE 中查看测试结果来定位未使用的 stub。

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.STRICT_STUBS)
class StrictStubbingTest {
@Mock
private MyService myService;
@Test
void testStrictMode() {
// 定义一个 stub
when(myService.doSomething()).thenReturn("result");
// 实际调用
String result = myService.doSomething();
// 验证结果
assertEquals("result", result);
}
}
如何使用 lenient() 忽略特定未使用的 stub
如果在某些场景下,确实需要定义一些 stub 但不希望它们被强制调用,可以使用 lenient() 方法来标记这些特定的 stub。这样即使开启了严格模式,被 lenient() 标记的 stub 也不会导致测试失败。这种方式适用于那些为了未来扩展或复杂条件分支而预先定义的 stub。

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.STRICT_STUBS)
class LenientStubbingTest {
@Mock
private MyService myService;
@Test
void testLenientMode() {
// 使用 lenient() 标记未必须调用的 stub
lenient().when(myService.optionalMethod()).thenReturn("optional");
// 定义一个必须调用的 stub
when(myService.requiredMethod()).thenReturn("required");
// 只调用 requiredMethod
String result = myService.requiredMethod();
assertEquals("required", result);
}
}
strict stubbing 模式下未调用 stub 的具体行为
在 strict stubbing 模式下,如果定义了 stub 但未在测试中调用,Mockito 会在测试结束后抛出 UnnecessaryStubbingException。这个异常会明确指出是哪个 mock 对象的哪个方法被未必要地 stubbed。开发者需要根据异常信息调整测试代码,要么移除未使用的 stub,要么确保该方法被正确调用。这种机制帮助保持测试代码的简洁性和准确性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











