为什么单元测试要用Mock?
首先添加maven依赖
然后为了使代码更简洁,最好在测试类中导入静态资源
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 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),如:
List spy = spy(newLinkedList());
when(spy.get(0)).thenReturn("foo");
doReturn("foo").when(spy).get(0);
当调用when(spy.get(0)).thenReturn("foo")时,会调用真实对象的get(0),由于list是空的所以会抛出IndexOutOfBoundsException异常,用doReturn可以避免这种情况的发生,因为它不会去调用get(0)方法。