最近写项目Junit,使用Junit4框架,测试的数据都要依赖数据库,而好多接口需要调其他的系统,junit4框架完全无法实现测试功能,大佬推荐用Mockito框架,这篇博客用来记录学习Mockito的使用方法,不足欢迎指点。
@Mock, @InjectMocks使用方法:
1、导入依赖
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
<scope>test</scope>
</dependency>
2、mockito一个简单案例
@Test
public void argumentMatchersTest(){
List<String> mock = mock(List.class);
when(mock.get(anyInt())).thenReturn("Hello").thenReturn("World");
String result=mock.get(100)+" "+mock.get(200);
verify(mock,times(2)).get(anyInt());
assertEquals("Hello World",result);
}
List mock = mock(List.class); 的作用就是创建一个mock模拟对象。
when(…).thenReturn(…); 返回预期值,当代用when里面方法时返回指定的值。
when(mock.get(anyInt())).thenReturn(“Hello”).thenReturn(“World”);
第一次当调用mock.get(anyInt())方法就会返回字符串Hello,再次调用返回字符串World。
3、打桩支持迭代风格的返回值设定:
// 第一种方式
when(i.next()).thenReturn("Hello").thenReturn("World");
// 第二种方式
when(i.next()).thenReturn("Hello", "World");
// 第三种方式,都是等价的
when(i.next()).thenReturn("Hello");
when(i.next()).thenReturn("World");
4、mockito需要添加@RunWith(MockitoJUnitRunner.class)
如果使用的Junit + mockito测试,那肯定使用的是@RunWith(SpringJUnit4ClassRunner.class),这时候需要在添加mockito的初始化。
@RunWith(MockitoJUnitRunner.class)
public class ArticleManagerTest {
@Mock
ArticleCalculator calculator;
@Mock
ArticleDatabase database;
@Mock
User user;
@InjectMocks
private ArticleManager manager; //①
@Test
public void shouldDoSomething() {
//使用了一个ArticleListener实例调用了addListener
manager.initialize();
// 验证database调用使用了ArticleListener类型的参数调用了addListener
verify(database).addListener(any(ArticleListener.class));
}
}
注意点:
1、对于 static 和 final 方法, Mockito 无法对其 when(…).thenReturn(…) 操作。
2、当我们连续两次为同一个方法使用 stub 的时候,他只会只用最新的一次。
@Mock、@Spy注解区别:
1、@Mock创建的是全部mock的对象,既在对具体的方法打桩之前,mock对象的所有属性和方法全被置空(0或者null);与之对应的是@Spy这个注解,@Spy可以创建部分mock的对象,部分mock对象的所有成员方法都会按照原方法的逻辑执行,直到被打桩返回某个具体的值。@Mock和@Spy才是两个具有可比性的概念。
2、 Mokcito的mock()方法功能与@Mock相同,只是使用方式和场景不同。同样的,@Spy也对应一个spy()方法。
3、@Mock和@Spy注解的对象,均可被@InjectMock注入到待处理的对象中。