Mockito快速入门

为什么单元测试要用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)方法。

你可能感兴趣的:(Mockito快速入门)