本文目录导读:

是的,Mock对象创建在近年来确实变得更简单了,主要得益于以下几个方面的进步:
Mock框架的演进
传统方式(较复杂)
// PowerMock + EasyMock 时代
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserService.class})
public class TestClass {
@Test
public void test() {
UserService mockService = createMock(UserService.class);
expect(mockService.getUser(1)).andReturn(new User());
replay(mockService);
}
}
现代方式(更简单)
// Mockito + JUnit5
@ExtendWith(MockitoExtension.class)
class TestClass {
@Mock
private UserService userService;
@InjectMocks
private UserController userController;
@Test
void test() {
when(userService.getUser(1)).thenReturn(new User());
}
}
关键简化点
注解驱动
- @Mock:直接声明Mock对象
- @InjectMocks:自动注入Mock
- @Spy:部分Mock
- @Captor:参数捕获
链式调用API
// 简洁的语法
when(mock.method())
.thenReturn(value)
.thenThrow(exception)
.thenAnswer(invocation -> customLogic);
无需显式验证
// 自动验证Mock使用 verify(mockService, times(1)).getUser(1); verify(mockService, never()).deleteUser(any());
现代框架推荐
| 框架 | 特点 | 适用场景 |
|---|---|---|
| Mockito | 简洁、灵活 | 绝大多数场景 |
| EasyMock | 类型安全 | 需要严格验证 |
| MockK | Kotlin原生 | Kotlin项目 |
| Moq | C#/.NET | .NET开发 |
示例对比:复杂的Mock场景
旧方式(Mockito 1.x)
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testComplex() {
doAnswer(invocation -> {
return complexLogic();
}).when(mock).method();
}
新方式(Mockito 5.x + JUnit5)
@ExtendWith(MockitoExtension.class)
class AdvancedTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ComplexService complexService;
@Test
void testComplex() {
when(complexService.getConfig()
.getDatabase()
.getConnection())
.thenReturn(mockConnection);
}
}
实际建议
对于现在的Java项目,推荐使用:
- Mockito 5.x + JUnit 5
- 配合 AssertJ 进行流畅断言
- 配合 ArchUnit 进行架构测试
确实,Mock对象的创建已经变得非常直观和简洁,开发者可以更专注于业务逻辑的测试,而不是框架配置。