最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的PowerMock使用實踐

 更新時間:2023年12月14日 09:41:08   作者:Terisadeng  
這篇文章主要介紹了Java中的PowerMock使用實踐,@PrepareForTest和@RunWith是成對出現(xiàn)的,一般@RunWith(PowerMockRunner.class),@PrepareForTest的值是引用的靜態(tài)方法或私有方法的類,需要的朋友可以參考下

一、常用注解

@PrepareForTest和@RunWith是成對出現(xiàn)的,一般@RunWith(PowerMockRunner.class),@PrepareForTest的值是引用的靜態(tài)方法或私有方法的類。

@InjectMocks注解標注的類會被注入所有被@Mock注解標注的類。

@Before注解用于方法,表示在執(zhí)行@Test注解標注的方法之前執(zhí)行。

在initMocks()方法中可以執(zhí)行MockitoAnnotations.initMocks(this);來將@Mock注解修飾的類注入到@InjectMocks修飾的類。

二、實例操作

首先定義三個類,分別是實體類Employee.java,數(shù)據(jù)操作類EmployeeDao.java,業(yè)務邏輯類EmployeeService.java,下面是3個類的具體定義:

public class Employee {
    private String name;
    private Double salary;
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the salary
     */
    public Double getSalary() {
        return salary;
    }
    /**
     * @param salary the salary to set
     */
    public void setSalary(Double salary) {
        this.salary = salary;
    }
}

EmployeeDao.java:

public interface EmployeeDao {
    public Employee getEmployee(String name);
 
    public boolean updateEmployee(Employee employee);
 
    public static void deleteEmployee(String name) {
        throw new NullPointerException();
    }
 
    public Exception saveEmployee(Employee employee);
}

EmployeeService.java:

public class EmployeeServiceImpl {
    private EmployeeDao employeeDao;
 
    public EmployeeServiceImpl() {
 
    }
 
    public EmployeeServiceImpl(EmployeeDao employeeDao) {
        this.employeeDao = employeeDao;
    }
 
    public Employee getEmployee(String name) {
        return employeeDao.getEmployee(name);
    }
 
    public boolean updateEmployee(Employee employee) {
        return employeeDao.updateEmployee(employee);
    }
 
    public boolean deleteEmployee(String name) {
        try {
            EmployeeDao.deleteEmployee(name);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
 
    public boolean saveEmployee(Employee employee) {
        try {
            employeeDao.saveEmployee(employee);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

PowerMockito知識點

下面是測試類中涉及到的PowerMockito知識點:

1)其中涉及到靜態(tài)方法,因此需要使用@RunWith(PowerMockRunner.class)

@PrepareForTest({ EmployeeDao.class })注解,PrepareForTest的值是靜態(tài)方法所在的類或接口,否則會報下面的錯誤:

org.powermock.api.mockito.ClassNotPreparedException: 
The class mock.EmployeeDao not prepared for test.
To prepare this class, add class to the '@PrepareForTest' annotation.
In case if you don't use this annotation, add the annotation on class or  method level. 
	at org.powermock.api.mockito.expectation.reporter.MockitoPowerMockReporter.classNotPrepared(MockitoPowerMockReporter.java:32)

2)使用@Before注解在調用@Test注解的方法之前進行初始化,比如使用mock(類的Class對象)來創(chuàng)建需要模擬的對象,這樣我們就可以假設被模擬的對象已經實現(xiàn),盡管他其實是一個沒有實現(xiàn)類的接口。

3)在模擬對象創(chuàng)建之后,我們就可以使用when(調用模擬對象的方法).thenReturn(定義方法調用的返回值),這樣我們就相當于假設調用被模擬對象的方法后返回的一直是thenReturn中定義的值。這樣我們就不用關心被模擬對象的實現(xiàn)按,只關心下面我們測試的業(yè)務邏輯是否存在問題。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ EmployeeDao.class })
public class EmployeeServiceImplTest {
    @Mock
    public EmployeeDao employeeDao;
    @Mock
    EmployeeServiceImpl employeeServiceImpl;
    // @Before注解的方法會在調用測試方法前執(zhí)行初始化動作
    @Before
    public void initMocks() {
        // 創(chuàng)建模擬對象EmployeeDao的實例
        employeeDao = mock(EmployeeDao.class);
        // 將模擬對象賦給業(yè)務類實例
        employeeServiceImpl = new EmployeeServiceImpl(employeeDao);
    }
    @Test
    public void getEmployeeTest() {
        String name = "scott";
        Employee employee = new Employee();
        employee.setName("scott");
        employee.setSalary(8888.0);
        // 定義當執(zhí)行employeeDao.getEmployee(name)方法時始終返回employee對象,相當于實現(xiàn)了employeeDao的這個方法
        when(employeeDao.getEmployee(name)).thenReturn(employee);
        /*
         * 下面測試我們想要單元測試的employeeServiceImpl.getEmployee(name)方法 我們已經屏蔽了該方法對employeeDao.getEmployee(name)的調用,相當于解除了依賴
         * 這樣我們只需要關心employeeServiceImpl.getEmployee(name)方法的邏輯是否存在問題
         */
        Employee employee2 = employeeServiceImpl.getEmployee(name);
        System.out.println(employee2.getSalary());
    }
    @Test
    public void updateEmployeeTest() {
        Employee employee = new Employee();
        employee.setName("tiger");
        employee.setSalary(99999.0);
        when(employeeDao.updateEmployee(anyObject())).thenReturn(true);
        Employee employee2 = new Employee();
        employee.setName("scott");
        employee.setSalary(99999.0);
        Boolean boolean1 = employeeServiceImpl.updateEmployee(employee2);
        System.out.println(boolean1);
    }
    @Test
    public void deleteEmployeeTest() {
        String name = "haha";
        // 因為這里調用的是靜態(tài)方法,因此使用PowerMockito.mockStatic(EmployeeDao.class);來模擬靜態(tài)類
        PowerMockito.mockStatic(EmployeeDao.class);
        // 使用doNothing()定義執(zhí)行下面一句語句時什么也不做
        PowerMockito.doNothing().when(EmployeeDao.class);
        // 這一句由于上面的doNothing()即使會拋異常也不會再拋
        EmployeeDao.deleteEmployee(name);
        // 因此employeeServiceImpl.deleteEmployee(name)執(zhí)行時也沒有發(fā)現(xiàn)異常返回true
        EmployeeServiceImpl employeeServiceImpl = new EmployeeServiceImpl();
        Assert.assertTrue(employeeServiceImpl.deleteEmployee(name));
    }
    @Test
    public void throwDeleteExceptionTest() {
        String name = "haha";
        PowerMockito.mockStatic(EmployeeDao.class);
        // doThrow()定義下面一句語句會拋出異常
        PowerMockito.doThrow(new NullPointerException()).when(EmployeeDao.class);
        EmployeeDao.deleteEmployee(name);
        // 因此employeeServiceImpl.deleteEmployee(name)執(zhí)行會返回false
        EmployeeServiceImpl employeeServiceImpl = new EmployeeServiceImpl();
        assertTrue(employeeServiceImpl.deleteEmployee(name));
    }
    @Test
    public void saveEmployeeTest() {
        Employee employee = new Employee();
        employee.setName("scott");
        employee.setSalary(8888.0);
        // 打樁,定義方法返回的值
        when(employeeDao.saveEmployee(employee)).thenReturn(new NullPointerException());
        // 這里doNothing()沒有生效,原因是這里調用的是實例方法,不是靜態(tài)方法
        PowerMockito.doNothing().when(employeeDao).saveEmployee(employee);
        employeeServiceImpl.saveEmployee(employee);
    }
    @Test
    public void throwSaveEmployeeTest() {
        Employee employee = new Employee();
        employee.setName("scott");
        employee.setSalary(8888.0);
        when(employeeDao.saveEmployee(employee)).thenReturn(new NullPointerException());
        // 這里的doThrow()實際沒有生效,因為這里調用的是實例方法,不是靜態(tài)方法,因此不存在使下一句語句拋異常的作用
        PowerMockito.doThrow(new NullPointerException()).when(employeeDao).saveEmployee(employee);
        employeeServiceImpl.saveEmployee(employee);
    }
}

到此這篇關于Java中的PowerMock使用實踐的文章就介紹到這了,更多相關PowerMock使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • javaweb用戶注銷后點擊瀏覽器返回刷新頁面重復登錄問題的解決方法

    javaweb用戶注銷后點擊瀏覽器返回刷新頁面重復登錄問題的解決方法

    這篇文章主要為大家詳細介紹了javaweb用戶注銷后點擊瀏覽器返回刷新頁面重復登錄問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Sentinel熱點規(guī)則示例詳解分析

    Sentinel熱點規(guī)則示例詳解分析

    這篇文章主要介紹了何為熱點?熱點即經常訪問的數(shù)據(jù)。很多時候我們希望統(tǒng)計某個熱點數(shù)據(jù)中訪問頻次最高的 Top K 數(shù)據(jù),并對其訪問進行限制
    2021-09-09
  • @RequestBody獲取不到參數(shù)的問題

    @RequestBody獲取不到參數(shù)的問題

    這篇文章主要介紹了@RequestBody獲取不到參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java?設計模式以虹貓藍兔的故事講解單例模式

    Java?設計模式以虹貓藍兔的故事講解單例模式

    單例模式(Singleton?Pattern)是?Java?中最簡單的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式
    2022-03-03
  • 基于SpringBoot整合oauth2實現(xiàn)token認證

    基于SpringBoot整合oauth2實現(xiàn)token認證

    這篇文章主要介紹了基于SpringBoot整合oauth2實現(xiàn)token 認證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 解決myBatis中openSession()自動提交的問題

    解決myBatis中openSession()自動提交的問題

    在學習MySQL過程中,發(fā)現(xiàn)插入操作自動提交,問題原因可能是myBatis中的openSession()方法設置了自動提交,或者是MySQL的默認引擎設置為不支持事務的MyISAM,解決辦法包括更改myBatis的提交設置或將MySQL表的引擎改為InnoDB
    2024-09-09
  • Java如何實現(xiàn)驗證碼驗證功能

    Java如何實現(xiàn)驗證碼驗證功能

    這篇文章主要教大家如何實現(xiàn)Java驗證碼驗證功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Jackson3遷移核心注意點總結大全

    Jackson3遷移核心注意點總結大全

    在升級Jackson版本時,最常見的問題是依賴沖突,在實際項目中往往會遇到各種問題,這篇文章主要介紹了Jackson3遷移核心注意點總結的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-05-05
  • Spring—@Value在static中引用方式

    Spring—@Value在static中引用方式

    這篇文章主要介紹了Spring—@Value在static中引用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java開發(fā)中的容器概念、分類與用法深入詳解

    Java開發(fā)中的容器概念、分類與用法深入詳解

    這篇文章主要介紹了Java開發(fā)中的容器概念、分類與用法,結合實例形式較為詳細的分析了java容器的相關概念、分類、使用方法與注意事項,需要的朋友可以參考下
    2017-11-11

最新評論

新乡市| 平昌县| 四川省| 庆城县| 梨树县| 淳化县| 盐边县| 清新县| 铁岭市| 子洲县| 黔西县| 徐州市| 太谷县| 长葛市| 应用必备| 崇左市| 于都县| 栾川县| 抚顺县| 清丰县| 南丹县| 延边| 清水县| 建瓯市| 沂水县| 磐安县| 夹江县| 洞口县| 郧西县| 安溪县| 临漳县| 会宁县| 墨竹工卡县| 吴忠市| 台北县| 龙门县| 恩施市| 忻城县| 乾安县| 永胜县| 诸暨市|