Mockito是一款针对Java的针对Java的mocking框架。在单元测试过程中,对于某些不容易构造或者不容易获取比较复杂的对象,用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。
Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。
Maven依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
Mock测试示例
@RunWith(MockitoJUnitRunner.class) // 使用MockitoJUnitRunner进行mocks的初始化和注入
public class DemoControllerTest {
@InjectMocks // InjectMocks注解可以创建一个实例调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
DemoController demoController;
@Mock // 创建一个Mock实例,单元测试运行会被注入到@InjectMocks创建的实例中。
DemoService demoService;
@Test
public void quaryName() {
// 当调用mock对象demoService.quaryName()方法时,返回默认值
when(demoService.quaryName(0)).thenReturn("test_name");
// 执行业务方法demoController.quaryName()
String name = demoController.quaryName(0);
// 验证当执行业务方法时,是否执行了mock方法 atLeastOnce()表示最少执行1次
verify(demoService, atLeastOnce()).quaryName(0);
// 断言业务方法的返回值
assertEquals("test_name", name);
}
}
Mockito虽然在Java单元测试中能够很轻松的对一些无法获得对象进行mock,但它无法完成对private/static/final方法的Mock,此时可以使用
PowerMock,PowerMock基于Mockito开发,且语法规则与Mockito一致。
不过静态或私有方法是否需要进行mock模拟也是得我们进行思考的。