天天看点

Java单元测试之 Mockito

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模拟也是得我们进行思考的。