探索單元測試系列(4) Mock對象的各種寫法

1. 通過Mockito.mock()來創建假對象

package com.example.demo.mock.controller;

import com.example.demo.junit.spring.service.JunitDemoService;
import com.example.demo.mock.service.MockDemoService;
import com.example.demo.mock.service.MockDemoServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.springframework.boot.test.mock.mockito.MockBean;

/**
 * Junit演示服務
 *
 * @ClassName JunitDemoService
 * @Author zhaoguang
 * @Date 2019/12/14
 * @Version 1.0
 */
public class MockDemoServiceTest {

    private MockDemoService mockDemoService;

    @Before
    public void init() {
        mockDemoService = Mockito.mock(MockDemoService.class);
    }

    @Test
    public void testAdd() {
        Mockito.when(mockDemoService.add(1,2)).thenReturn(3);
        Assert.assertEquals(3, mockDemoService.add(1, 2));
    }
}

 注意,這種寫法是可以對接口進行mock的。

2. 通過@Mock註解創建假對象

package com.example.demo.mock.controller;

import com.example.demo.junit.spring.service.JunitDemoService;
import com.example.demo.mock.service.MockDemoService;
import com.example.demo.mock.service.MockDemoServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.mock.mockito.MockBean;

/**
 * Junit演示服務
 *
 * @ClassName JunitDemoService
 * @Author zhaoguang
 * @Date 2019/12/14
 * @Version 1.0
 */
@RunWith(MockitoJUnitRunner.class)
public class MockDemoServiceTest {

    @Mock
    private MockDemoService mockDemoService;

    @Test
    public void testAdd() {
        Mockito.when(mockDemoService.add(1,2)).thenReturn(3);
        Assert.assertEquals(3, mockDemoService.add(1, 2));
    }
}

注意,@Mock註解是mockito(不是junit)提供的,所以需要通過@RunWith註解來指定運行環境是Mockito。

或者,也可以這樣寫:

package com.example.demo.mock.controller;

import com.example.demo.junit.spring.service.JunitDemoService;
import com.example.demo.mock.service.MockDemoService;
import com.example.demo.mock.service.MockDemoServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * Junit演示服務
 *
 * @ClassName JunitDemoService
 * @Author zhaoguang
 * @Date 2019/12/14
 * @Version 1.0
 */
public class MockDemoServiceTest {

    @Mock
    private MockDemoService mockDemoService;

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

    @Test
    public void testAdd() {
        Mockito.when(mockDemoService.add(1,2)).thenReturn(3);
        Assert.assertEquals(3, mockDemoService.add(1, 2));
    }
}

3.通過@MockBean註解創建假對象

package com.example.demo.mock.controller;

import com.example.demo.junit.spring.service.JunitDemoService;
import com.example.demo.mock.service.MockDemoService;
import com.example.demo.mock.service.MockDemoServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * Junit演示服務
 *
 * @ClassName JunitDemoService
 * @Author zhaoguang
 * @Date 2019/12/14
 * @Version 1.0
 */
@RunWith(SpringRunner.class)
public class MockDemoServiceTest {

    @MockBean
    private MockDemoService mockDemoService;

    @Test
    public void testAdd() {
        Mockito.when(mockDemoService.add(1,2)).thenReturn(3);
        Assert.assertEquals(3, mockDemoService.add(1, 2));
    }
}

注意,@MockBean註解是SpringBoot(不是mockito)提供的,所以需要通過@RunWith註解指定運行環境爲Spring。

4. @InjectMocks註解用於創建被依賴的假對象

  在實際的代碼中,往往不可能只測試沒有任何依賴的類,大多數場景中都至少是A依賴B的關係.我們要測試A時,就需要對B進行Mock。像這樣寫就可以了:

@InjectMocks
private B b;

@Mock
private A a;

 

擴展內容

    @RunWith註解是Junit提供的用於指定單元測試運行環境的。參數value的值必須是繼承了org.junit.runner.Runner類的一個實現類。Runner的家族圖譜如下:

發佈了119 篇原創文章 · 獲贊 23 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章