@Mock, @InjectMocks注解模拟打桩Mockito框架

最近写项目Junit,使用Junit4框架,测试的数据都要依赖数据库,而好多接口需要调其他的系统,junit4框架完全无法实现测试功能,大佬推荐用Mockito框架,这篇博客用来记录学习Mockito的使用方法,不足欢迎指点。
@Mock, @InjectMocks使用方法:
1、导入依赖

 
    org.mockito 
    mockito-all 
    1.8.5 
    test 

2、mockito一个简单案例

@Test 
public void argumentMatchersTest(){ 
    List 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注入到待处理的对象中。

你可能感兴趣的:(java)