Spring单元测试总结

之前自己跟着网上做项目的时候,因为是从下到上都是自己开发的,测试也是从下到上一层层的集成测试,一直没有理解单元测试的精华,实习以后接手的都是一些基于其他项目的小需求,如果会用单元测试就会轻量很多,方便很多,这里主要总结了单元测试常用的东西,以后如果用深入了或许还会添加一些。单元测试最主要的是创建mock对象,打桩,调用方法,验证交互,断言结果

 

Mock的使用

一般来说,Mockito都和Junit是配合使用的,在pom.xml中要引入这两个依赖

  • 创建mock对象

    • 在spring中,测试类添加@RunWith(MockitoJunitClassRunner.class),然后对要mock的对象添加@mock注释
    • 使用Class mockObj = Mockito.mock(Class.class);
  • @Test:在测试方法上添加@Test注释

    @Test(excepted=xx.class): xx.class表示异常类,表示测试的方法抛出此异常时,认为是正常的测试通过的;@Test(timeout=毫秒数) :测试方法执行时间是否符合预期

  • stub 打桩

    • when(mockObj.method())thenReturn()
    • doReturn()when(mockObj).method()
    • 返回值为void时,可用doNothing()when().method()
  • @Spy或Mockito.spy():

    被@Spy或Mockito.spy() 封装的对象,只要没有被打桩stub的方法,都会真实的调用对象的方法

  • 验证交互(varify)

    • 验证方法

      verify(mockObj,times(5)).method():验证方法被调用5次,time()还可以被换成:

      • never()
      • atLeastOnce()
      • atLeast(4)
      • atMost(6)
  • 断言结果(assert) 断言属于Junit包下的方法

    • 判断相同(equal):assertEqueals(msg,exceptValue,mockObj.method())
    • 判断真/假:assertTure(msg,condition)/assertFalse(msg,condition)
    • 判断空/非空:assertNull(msg,obj)/assertNotNull(msg,obj)
    • 判断相等/不等(==): assertSame(msg,except,actual)/assertNotSame(msg,except,actual)

    源码参考:https://www.cnblogs.com/qlqwjy/p/7246029.html

  • 参数匹配器

    • 模拟参数:anyInt()/anyByte/anyObject()/anyLong()/anyList()
    • 判断参数:
      • isA()(判断是否是某个类的实例)
      • isNull() 判断某个参数是否为空
      • same()
      • eq()
    • startsWith()
  • @Before方法

    在每个@Test方法执行前都会执行的方法,可以用来对公用的依赖对象进行mock和打桩

细节问题

  • when()thenReturn和doReturn()when().method()的区别:

    当对象被@Spy或者Mockito.spy()封装的时候,使用when()thenReturn()打桩会失败,因为会真实的调用对象的方法,而不是返回打桩的结果,但是可以使用doReturn()when().method()来打桩,这时可以打桩成功。 参考 https://blog.csdn.net/u010781856/article/details/78110783

  • Mockito参考https://www.jianshu.com/p/f6e3ab9719b9

  • Mockito限制:

    • final类不能被mock
    • 匿名类不能被mock
    • 原始类型不能被mock
    • Mockito不能mock静态方法,这时可以用Powermock

以上的限制是因为easyMock和Mockito是基于动态代理实现的,而Powermock是基于CGLib实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值