美文网首页
@Mock, @Spy和 @InjectMocks快速使用指南

@Mock, @Spy和 @InjectMocks快速使用指南

作者: 一路花开_8fab | 来源:发表于2019-04-14 16:50 被阅读0次

该系列文章翻译自https://www.baeldung.com/mockito-series

1.如何使Mockito的注解生效

方法1:给被测类添加@RunWith(MockitoJUnitRunner.class)注解

@RunWith(MockitoJUnitRunner.class)
public class MockitoAnnotationTest {
    ...
}

方法2:在初始化方法中使用MockitoAnnotations.initMocks(this)

@Before
public void init() {
    MockitoAnnotations.initMocks(this);
}

2.@Mock注解

@Mock用于代替Mockito.mock创建mock对象。
使用Mockito.mock的例子如下:

@Test
public void whenNotUseMockAnnotation_thenCorrect() {
    List mockList = Mockito.mock(ArrayList.class);
     
    mockList.add("one");
    Mockito.verify(mockList).add("one");
    assertEquals(0, mockList.size());
 
    Mockito.when(mockList.size()).thenReturn(100);
    assertEquals(100, mockList.size());
}

使用@Mock的例子如下:

@Mock
List<String> mockedList;
 
@Test
public void whenUseMockAnnotation_thenMockIsInjected() {
    mockedList.add("one");
    Mockito.verify(mockedList).add("one");
    assertEquals(0, mockedList.size());
 
    Mockito.when(mockedList.size()).thenReturn(100);
    assertEquals(100, mockedList.size());
}

3.@Spy注解

@Spy注解用于替代Mockito.spy创建spy对象
使用Mockito.spy例子如下:

@Test
public void whenNotUseSpyAnnotation_thenCorrect() {
    List<String> spyList = Mockito.spy(new ArrayList<String>());
     
    spyList.add("one");
    spyList.add("two");
 
    Mockito.verify(spyList).add("one");
    Mockito.verify(spyList).add("two");
 
    assertEquals(2, spyList.size());
 
    Mockito.doReturn(100).when(spyList).size();
    assertEquals(100, spyList.size());
}

使用@Spy例子如下:

@Spy
List<String> spiedList = new ArrayList<String>();
 
@Test
public void whenUseSpyAnnotation_thenSpyIsInjected() {
    spiedList.add("one");
    spiedList.add("two");
 
    Mockito.verify(spiedList).add("one");
    Mockito.verify(spiedList).add("two");
 
    assertEquals(2, spiedList.size());
 
    Mockito.doReturn(100).when(spiedList).size();
    assertEquals(100, spiedList.size());
}

4.@InjectMocks注解

@InjectMocks用于自动注入@Spy和@Mock标注的对象,举例如下:

@Mock
Map<String, String> wordMap;
 
@InjectMocks
MyDictionary dic = new MyDictionary();
 
@Test
public void whenUseInjectMocksAnnotation_thenCorrect() {
    Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning");
 
    assertEquals("aMeaning", dic.getMeaning("aWord"));
}

MyDictionary类的定义如下:

public class MyDictionary {
    Map<String, String> wordMap;
 
    public MyDictionary() {
        wordMap = new HashMap<String, String>();
    }
    public void add(final String word, final String meaning) {
        wordMap.put(word, meaning);
    }
    public String getMeaning(final String word) {
        return wordMap.get(word);
    }
}

相关文章

  • @Mock, @Spy和 @InjectMocks快速使用指南

    该系列文章翻译自https://www.baeldung.com/mockito-series 1.如何使Mock...

  • Mockito

    spy()/@spy 和 mock()/@mock的区别 简单理解: spy是partial mock,spy需要...

  • PowerMockito使用方法和避坑指南

    常用方法 模拟对象 PowerMockito.spy(T object)可用于mock某个对象,调用该对象某个方法...

  • 2018-06-08 Mockito

    Mockito 初始化注解 背景:使用@Mock,@spy,@InjectMock等注解需要先初始化才能使用。 初...

  • mockito 技巧合集

    打桩类的私有变量 在@InjectMocks对象的fields里面,使用@InjectMocks对象 使用Powe...

  • 《Effective Unit Testing》 读书笔记 5

     在上篇读书笔记中介绍了四种测试替身,分别是stub, fake object, test spy, mock o...

  • Mockito @Spy与@Mock区别

    在没有进行Mock,即没有when(...).thenReturn(...)或者doReturn(...).whe...

  • 接口测试Mock与HttpClient

    1.Mock框架 1.1mock介绍: mock可以模拟接口测试,通过运行mock框架的jar,快速搭建接口测试。...

  • mock使用指南

    1. 在mocl.js中准备数据和被请求地址 2. 在api目录下模拟发送请求 3 在单页面应用中导入模拟发送的请...

  • 单元测试典型场景

    一、典型场景单元测试代码示例 场景一:模型内部测试 场景二:需要Mock或者Spy对象用于配合当前模型测试 场景三...

网友评论

      本文标题:@Mock, @Spy和 @InjectMocks快速使用指南

      本文链接:https://www.haomeiwen.com/subject/uylswqtx.html