<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 使用 PowerMock 進行模擬測試(帶有 JUnit 和 Mockito) > 原文: [https://howtodoinjava.com/library/mock-testing-using-powermock-with-junit-and-mockito/](https://howtodoinjava.com/library/mock-testing-using-powermock-with-junit-and-mockito/) **PowerMock** 是 Java 世界的開源模擬庫。 它擴展了現有的 Mockito 框架,例如 [**EasyMock**](http://www.easymock.org/ "easymock") 和 [**Mockito**](https://code.google.com/p/mockito/ "mockito"),為它們添加了更強大的功能。 PowerMock 使我們能夠為最不可測試的代碼編寫良好的單元測試。 Java 中的大多數 Mockito 框架都不能模擬靜態方法或最終類。 但是使用 PowerMock,我們可以模擬幾乎任何類。 PowerMock 當前擴展了 EasyMock 和 Mockito 模擬框架。 根據首選的擴展名,編寫任何單元測試的語法略有不同。 在本教程中,我將 PowerMock 與 Mockito 結合使用。 本教程將演示一個使用 PowerMock 的非常簡單的模擬示例。 它將向我們展示創建模擬和驗證方法調用的基本語法。 ## PowerMock 和依賴項的安裝 PowerMock 是一個正在積極開發的開源 Mockito 框架。 您可以按照以下步驟在計算機中進行設置。 1)首先下載 PowerMock 1.5。 通過 [http://code.google.com/p/powermock/](https://code.google.com/p/powermock/ "powermock home") 訪問 PowerMock 主頁。 2)點擊頁面上的下載選項卡,您應該看到如下內容: ![powermock download page](https://img.kancloud.cn/10/d4/10d4eaa93dd873a51b7ebd88a62d402a_835x313.png) 3)由于我們將使用 Mockito 擴展和 JUnit 測試框架來開發所有示例,因此請下載`powermock-mockito-junit-1.6.zip`文件。 4)將 ZIP 文件解壓縮到某個文件夾中。 該 ZIP 文件包含使用 PowerMock 編寫單元測試所需的所有從屬 JAR 文件。 5)將所有 jar 文件復制到項目的`lib`文件夾中,并將其添加為依賴項。 你完成了! 如果您還沒有的話,您可能需要另外添加“[`hamcrest-core-1.3.jar`](https://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-core-1.3.jar "hamcrest")”。 ## 使用的類 為了完整起見,讓我首先在下面的類中寫下我們將在測試示例中使用的類。 **`Employee.java`** ```java public class Employee { private String fName; public String getfName() { return fName; } public void setfName(String fName) { this.fName = fName; } } ``` **`EmployeeService.java`** ```java public class EmployeeService { public int getEmployeeCount() { throw new UnsupportedOperationException(); } public void saveEmployee(Employee employee) { //return nothing } } ``` **`EmployeeController.java`** ```java public class EmployeeController { private EmployeeService employeeService; public EmployeeController(EmployeeService employeeService) { this.employeeService = employeeService; } public int getProjectedEmployeeCount() { final int actualEmployeeCount = employeeService.getEmployeeCount(); return actualEmployeeCount * 2; } public void saveEmployee(Employee employee) { employeeService.saveEmployee(employee); } } ``` ## 不帶 PowerMock 的首次測試 讓我們編寫一個簡單的測試來獲得不使用模擬的員工人數。 如您所見`EmployeeService.getEmployeeCount()`方法拋出`UnsupportedOperationException`,則測試應失敗。 ```java @Test public void shouldGetCountOfEmployees() { EmployeeController employeeController =new EmployeeController(new EmployeeService()); Assert.assertEquals(10,employeeController.getProjectedEmployeeCount()); } ``` 在運行測試時,它肯定會失敗,并帶有以下異常。 ```java java.lang.UnsupportedOperationException at com.howtodoinjava.powermock.examples.service.EmployeeService.getEmployeeCount(EmployeeService.java:8) at com.howtodoinjava.powermock.examples.controller.EmployeeController.getProjectedEmployeeCount(EmployeeController.java:16) at com.howtodoinjava.powermock.examples.test.EmployeeControllerTestOne.shouldGetCountOfEmployees(EmployeeControllerTestOne.java:15) ``` 在不允許您使用某種方法的任何應用中都可能出現這種情況,并且原因可以是無限的。 在這種情況下,您可能希望模擬上述方法,以便可以測試應用的其他部分。 ## 使用 PowerMock 模擬一種簡單的方法 在上面的示例中,不支持`getEmployeeCount()`方法,但我們想使用它。 在這種情況下,我們可以使用 powermock 模擬它。 ```java @Test public void firstMockTest() { //Creating a mock using the PowerMockito.mock //method for the EmployeeService class. EmployeeService mock =PowerMockito.mock(EmployeeService.class); //Next statement essentially says that when getProjectedEmployeeCount method //is called on the mocked EmployeeService instance, return 8. PowerMockito.when(mock.getEmployeeCount()).thenReturn(8); EmployeeController employeeController = new EmployeeController(mock); Assert.assertEquals(16, employeeController.getProjectedEmployeeCount()); } ``` 以上測試將成功執行。 在此,當調用`employeeController.getProjectedEmployeeCount()`時,它依次從模擬對象中調用方法`getEmployeeCount()`,該方法返回值 8。控??制器將其乘以 2,返回值為 16。該返回值等于`assert`語句中的期望值, 因此測試通過了。 ## 驗證是否真的調用了模擬方法? 有時,單元測試只需要調用一個方法而忘記它。 主要是因為方法不返回任何值。 您肯定可以通過再次從數據源獲取值來測試 DB 中是否存在值。 但是,如果您的測試僅需要驗證方法是否已被調用,就可以使用 powermock 進行。 ```java @Test public void verifyMethodInvokationTest() { EmployeeService mock =PowerMockito.mock(EmployeeService.class); EmployeeController employeeController = new EmployeeController(mock); Employee employee = new Employee(); employeeController.saveEmployee(employee); //Verifying that controller did call the //saveEmployee() method on the mocked service instance. Mockito.verify(mock).saveEmployee(employee); } ``` 在上面的測試示例中,我們使用`verify(mock)`方法驗證了`saveEmployee(employee)`是否確實已被調用。 如果您通過測試,則將通過。 要驗證上述代碼是否正常運行,請在`EmployeeController.java`的下面一行中注解掉。 ```java public void saveEmployee(Employee employee) { //employeeService.saveEmployee(employee); //Comment this line } ``` 現在,如果您再次運行測試,它將失敗并顯示此錯誤。 ```java Wanted but not invoked: employeeService.saveEmployee( com.howtodoinjava.powermock.examples.model.Employee@7808b9 ); -> at com.howtodoinjava.powermock.examples.test.EmployeeControllerTestOne.verifyMethodInvokationTest(EmployeeControllerTestOne.java:47) Actually, there were zero interactions with this mock. ``` 您可以在單元測試中擁有非常好的功能。 ## 使用模擬設置獲取有關測試運行的更多信息 這些模擬設置很少使用,但在某些情況下很有用。 如果您想為模擬命名,以供將來調試之用,請使用它們。 或者您想啟用詳細日志記錄以獲取更多信息。 當您要注冊一個監聽器來通知該模擬方法的調用時,可以使用它。 甚至在尚未實現實際對象的模擬對象上實現一些額外的接口。 ```java @Test public void MockettingsTest() { EmployeeService mock =PowerMockito.mock(EmployeeService.class, Mockito .withSettings() .name("EmployeeServiceMock") .verboseLogging()); EmployeeController employeeController = new EmployeeController(mock); Employee employee = new Employee(); employeeController.saveEmployee(employee); //Verifying that controller did call the //saveEmployee method on the mocked service //instance. Mockito.verify(mock).saveEmployee(employee); } ``` 運行以上測試以在控制臺中獲得以下結果: ```java ############ Logging method invocation #1 on mock/spy ######## employeeService.saveEmployee( com.howtodoinjava.powermock.examples.model.Employee@c9131c ); invoked: -> at com.howtodoinjava.powermock.examples.controller.EmployeeController.saveEmployee(EmployeeController.java:21) has returned: "null" ############ Logging method invocation #2 on mock/spy ######## employeeService.saveEmployee( com.howtodoinjava.powermock.examples.model.Employee@c9131c ); invoked: -> at com.howtodoinjava.powermock.examples.test.EmployeeControllerTestOne.MockettingsTest(EmployeeControllerTestOne.java:64) has returned: "null" ``` 這就是有關 powermock 的初學者教程的全部內容,可幫助您入門。 我將在下一組教程中介紹一些復雜的主題。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看