Mockito快速入门

时间:2024-05-20 13:30:43
为什么单元测试要用Mock?
Mockito快速入门
首先添加maven依赖
Mockito快速入门
然后为了使代码更简洁,最好在测试类中导入静态资源
Mockito快速入门


1.简单的mock操作:
【创建mock对象不能对final,Anonymous(匿名) ,primitive类(原始)进行mock】
【可以用PowerMockito的 @PrepareForTest()注入final类等】
@RunWith(PowerMockRunner.class)语句告诉JUnit用PowerMockRunner来执行测试。
@PrepareForTest(XX.class)语句告诉PowerMock准备XX类进行测试。适用于模拟final类或有final, private, static, native方法的类。

@Test
public void test(){
List<String> list = Mockito.mock(List.class);
Mockito.when(list.get(0)).thenReturn("helloworld");
String result = list.get(0);
Mockito.verify(list).get(0);// 验证list.get(0)是否执行了
Assert.assertEquals("helloworld",result);//(预期值,得到的值)
}


2.异常

@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void test(){
Object obj = new Object();//参数设置
thrown.expect(xxooException.class);//预期将抛出的异常
xxService.someMethod(obj);//执行方法,若抛出预期的异常则test成功通过
}


3.怎么mock一个abstract抽象类
可以先创建一个子类继承这个abstract类,override该抽象类的abstract方法,不用override其它方法

@InjectMocks
@Spy
private AbstractService verifyService = new MockService();

private class MockService extends AbstractService{
@Override
public String someMethod() {return null;}
}


4.Mock对象只能调用stubbed方法,调用不了它真实的方法。
但Mockito可以监视(@Spy)一个真实的对象,这时对它进行方法调用时它将调用真实的方法,
同时也可以stubbing这个对象的方法让它返回我们的期望值。另外不论是否是真实的方法调用都可以进行verify验证。
but和创建mock对象一样,对于final类、匿名类和Java的基本类型是无法进行spy的。 
监视对象 
监视一个对象需要调用spy(T object)方法,如:List spy = spy(new LinkedList());那么spy变量就在监视LinkedList实例。 
被监视对象的Stubbing 
stubbing被监视对象的方法时要慎用when(Object),如: 
  1. List spy = spy(new LinkedList());  
  2. when(spy.get(0)).thenReturn("foo");    
  3. doReturn("foo").when(spy).get(0);  
当调用when(spy.get(0)).thenReturn("foo")时,会调用真实对象的get(0),由于list是空的所以会抛出IndexOutOfBoundsException异常,用doReturn可以避免这种情况的发生,因为它不会去调用get(0)方法。 


5.一个真实的对象,无法用stubbing这个对象的方法让它返回我们的期望值。但是可以通过用@Spy这个对象,就可以stubbing这个对象的方法了。