Java单元测试之 Mockito-阿里云开发者社区

开发者社区> Java技术进阶> 正文
登录阅读全文

Java单元测试之 Mockito

简介: 对于程序员是否有必要编写test case,何时编写依然存在很多争议,各种互斥的方法论(SE/AM/XP/TDD),以及不同的开发文化,但是可以确定是编写单元测试用例有助于提高编程能力。
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模拟也是得我们进行思考的。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
Java技术进阶
使用钉钉扫一扫加入圈子
+ 订阅

Java技术进阶成长,课程资料,案例解析,实战经验全都有!

官网链接