Administrator
Published on 2026-04-26 / 15 Visits
0
0

Mockito

参考:Mockito Series | Baeldung
Mockito Tutorial

TL;DR

Mockito 让我们可以方便的创建任何类的代理实例,并方便地控制这个实例的行为
应用:当你想测试函数A,但函数A运行必须的函数B还没有写好,那么此时可以mock函数B,让函数A正常运行下去

Cheatsheet

使用方法

  • mock(): 创造一个替身

  • when(...).thenReturn(...): 给替身写剧本(打桩 Stubbing

  • verify(...): 检查替身是否真的按剧本演了(验证 Verification

// 1. 选角
List<String> mockedList = mock(List.class);

// 2. 写剧本:当调用 get(0) 时,返回 "first"
when(mockedList.get(0)).thenReturn("first");

// 3. 演员上场(在你的业务逻辑里被调用)
System.out.println(mockedList.get(0)); // 输出 "first"

// 4. 检查:确保 get(0) 真的被调用过 1 次
verify(mockedList).get(0);

mock()

当没有使用when 指定行为时,代理实例会返回默认值;Integer 返回0 Object返回null之类

@MockBean

在spring环境下
如果想要代理类能在其他地方被使用,那么就要进行依赖注入

spy()

与mock()几乎一样,唯一不同的是,当没有指定行为时,代理实例执行原类方法,就像一个spy

@ExtendWith(MockitoExtension.class)

@ExtendWith(MockitoExtension.class) // Mockito 开始工作
class UserServiceTest {

    @Mock
    private UserCenterService userCenterService; // 代理

    @InjectMocks
    private UserService userService; // 被代理替代的

    @Test
    void testCreate() {
        // ... 写剧本 ...
        // ... 执行业务 ...
        // ... 验证结果 ...
    }
}

@Mock: 相当于 mock(Class)

@InjectMocks

尝试new userService实例(类似Bean), 然后对于userService 的成员变量userCenterService,发现有对应的@Mock,就把userCenterService 注入到userService中


Comment