日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JUnit与EasyMock合作

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUnit与EasyMock合作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

開發人員始終需要注意所產生的代碼。 在實施新功能或修復某些錯誤之后,應確保它們能夠正常工作。 至少可以借助單元測試來實現。 由于此博客致力于Java編程語言,因此今天我將撰寫有關JUnit 4.1和EasyMock 3. 1框架的文章。 這些框架的主要目的是簡化單元測試的編寫。

介紹

為了演示JUnit和EasyMock功能,我需要準備一些代碼,這些代碼將在測試中介紹。 因此,一開始我將向您介紹一個簡單的
我為本教程開發的應用程序。 Java開發人員應該非常熟悉它,因為它可以模擬咖啡機的工作。 現在,我將用幾句話描述應用程序的功能。 咖啡機有兩個容器:用于盛水和用于咖啡。 您可以根據份量(小,中,大)制作三種咖啡。

  • 積極的情況:您使一部分咖啡和容器中有足夠的水和咖啡豆。
  • 負面的情況:您煮了一部分咖啡,容器中沒有足夠的水或咖啡豆。

如果沒有足夠的容器,您可以重新裝滿。 在簡要描述了應用程序的功能之后,您可以輕松地想象它應該如何工作。 現在該提供類的代碼示例了。

申請代碼

現在嘗試變得更加耐心和細心。 您將在下面看到很多類,我將在下一段中對其進行測試。 如上所述,咖啡機可以生產三種類型的咖啡,具體取決于要獲取的份量。 應用程序中的部分將表示為枚舉。

public enum Portion {SMALL(1), MEDIUM(2), LARGE(3);private int size;private Portion(int size) {this.size = size;}public int size() {return size;} }

我們的咖啡機有兩個容器,這意味著我們需要為它們構建邏輯體系結構。 讓我們堅持基于接口的智能編碼方法。

public interface IContainer {public boolean getPortion(Portion portion) throws NotEnoughException;public int getCurrentVolume();public int getTotalVolume();public void refillContainer();}

為了避免代碼重復,我需要為容器開發一個抽象類。 在這種編程方法的上下文中,我想考慮一下我的一篇有關Abstract類VS接口的文章 。

public abstract class AbstractContainer implements IContainer {private int containerTotalVolume;private int currentVolume;public AbstractContainer(int volume) {if (volume < 1)throw new IllegalArgumentException('Container's value must be greater then 0.');containerTotalVolume = volume;currentVolume = volume;}@Overridepublic boolean getPortion(Portion portion) throws NotEnoughException {int delta = currentVolume - portion.size();if (delta > -1) {currentVolume -= portion.size();return true;} elsethrow new NotEnoughException('Refill the '+ this.getClass().getName());}@Overridepublic int getCurrentVolume() {return currentVolume;}@Overridepublic int getTotalVolume() {return containerTotalVolume;}@Overridepublic void refillContainer() {currentVolume = containerTotalVolume;}}

抽象容器中的方法是自我解釋的,因此無需在其上停止更多細節。 您可能已經注意到NotEnoughException,不用擔心,這沒什么特別的,只是針對應用程序定制的異常。

public class NotEnoughException extends Exception {public NotEnoughException(String text) {super(text);}}

容器接口和抽象類的開發完成后,我們可以繼續進行具體的容器實現。

public class CoffeeContainer extends AbstractContainer {public CoffeeContainer(int volume) {super(volume);}}

同一類用于水容器:

public class WaterContainer extends AbstractContainer {public WaterContainer(int volume) {super(volume);}}

現在,我們擁有開發與咖啡機相關的代碼所需的所有內容。 和以前一樣,我將從界面開發開始。

public interface ICoffeeMachine {public boolean makeCoffee(Portion portion) throws NotEnoughException;public IContainer getCoffeeContainer();public IContainer getWaterContainer();}

最后是咖啡機的實現:

public class CoffeeMachine implements ICoffeeMachine {private IContainer coffeeContainer;private IContainer waterContainer;public CoffeeMachine(IContainer cContainer, IContainer wContainer) {coffeeContainer = cContainer;waterContainer = wContainer;}@Overridepublic boolean makeCoffee(Portion portion) throws NotEnoughException {boolean isEnoughCoffee = coffeeContainer.getPortion(portion);boolean isEnoughWater = waterContainer.getPortion(portion);if (isEnoughCoffee && isEnoughWater) {return true;} else {return false;}}@Overridepublic IContainer getWaterContainer() {return waterContainer;}@Overridepublic IContainer getCoffeeContainer() {return coffeeContainer;}}

就是這樣,與要在單元測試的幫助下測試的程序有關。

JUnit測試

在開始JUnit測試開發之前,我想重復單元測試的規范目標。 單元測試檢查功能的最小部分-方法或類。 這種情況對開發施加了一定的邏輯限制。 這意味著您不需要在方法中添加一些額外的邏輯,因為在此之后,測試變得更加困難。 還有一件更重要的事情–單元測試意味著功能與應用程序其他部分的隔離。 在使用方法“ B”時,我們不需要檢查方法“ A”的功能。 因此,讓我們為咖啡機應用程序編寫JUnit測試。 為此,我們需要向pom.xml添加一些依賴項

...<dependency><groupid>org.easymock</groupid><artifactid>easymock</artifactid><version>3.1</version></dependency><dependency><groupid>junit</groupid><artifactid>junit</artifactid><version>4.11</version></dependency> ...

我選擇了AbstractContainer類來演示JUnit測試。 因為在應用程序上下文中,我們有該類的兩種實現,并且如果要為其編寫測試,則自動地,我們將測試WaterContainer類和CoffeeContainer類。

import static org.junit.Assert.assertEquals;import org.junit.After; import org.junit.Before; import org.junit.Test;import com.app.data.Portion; import com.app.exceptions.NotEnoughException; import com.app.mechanism.WaterContainer; import com.app.mechanism.interfaces.IContainer;public class AbstractContainerTest {IContainer waterContainer;private final static int VOLUME = 10;@Beforepublic void beforeTest() {waterContainer = new WaterContainer(VOLUME);}@Afterpublic void afterTest() {waterContainer = null;}@Test(expected = IllegalArgumentException.class)public void testAbstractContainer() {waterContainer = new WaterContainer(0);}@Testpublic void testGetPortion() throws NotEnoughException {int expCurVolume = VOLUME;waterContainer.getPortion(Portion.SMALL);expCurVolume -= Portion.SMALL.size();assertEquals('Calculation for the SMALL portion is incorrect',expCurVolume, waterContainer.getCurrentVolume());waterContainer.getPortion(Portion.MEDIUM);expCurVolume -= Portion.MEDIUM.size();assertEquals('Calculation for the MEDIUM portion is incorrect',expCurVolume, waterContainer.getCurrentVolume());waterContainer.getPortion(Portion.LARGE);expCurVolume -= Portion.LARGE.size();assertEquals('Calculation for the LARGE portion is incorrect',expCurVolume, waterContainer.getCurrentVolume());}@Test(expected = NotEnoughException.class)public void testNotEnoughException() throws NotEnoughException {waterContainer.getPortion(Portion.LARGE);waterContainer.getPortion(Portion.LARGE);waterContainer.getPortion(Portion.LARGE);waterContainer.getPortion(Portion.LARGE);}@Testpublic void testGetCurrentVolume() {assertEquals('Current volume has incorrect value.', VOLUME,waterContainer.getCurrentVolume());}@Testpublic void testGetTotalVolume() {assertEquals('Total volume has incorrect value.', VOLUME,waterContainer.getTotalVolume());}@Testpublic void testRefillContainer() throws NotEnoughException {waterContainer.getPortion(Portion.SMALL);waterContainer.refillContainer();assertEquals('Refill functionality works incorectly.', VOLUME,waterContainer.getCurrentVolume());}}

我需要解釋所有使用的注釋。 但是我對此很懶,我只給您一個指向JUnit API的鏈接。 在這里,您可以閱讀最正確的說明。 注意所有測試的共同點–它們都標記有@Test批注,它表示以下方法是測試,并且每個測試都以某些“ assert ”方法結尾。 斷言對于每個測試都是必不可少的部分,因為應該在測試的最后檢查所有操作。

具有EasyMock測試的JUnit

好的,在上一段中,我向您展示了幾個簡單的JUnit測試示例。 在該示例中,測試不與任何其他類協作。 如果我們需要在JUnit測試中包含一些額外的類怎么辦? 我在上面提到,單元測試應該與其余應用程序的功能隔離。 為此,您可以使用EasyMock測試框架 。 借助EasyMock,您可以創建模擬游戲。 嘲笑是模擬真實具體對象行為的對象,但是有了一個大的加號,您可以為模擬指定狀態,這樣,您就可以在特定的單元測試時刻為假對象獲得該狀態。

import static org.junit.Assert.*;import org.easymock.EasyMock; import org.junit.After; import org.junit.Before; import org.junit.Test;public class CoffeeMachineTest {ICoffeeMachine coffeeMachine;IContainer coffeeContainer;IContainer waterContainer;@Beforepublic void setUp() {coffeeContainer = EasyMock.createMock(CoffeeContainer.class);waterContainer = EasyMock.createMock(WaterContainer.class);coffeeMachine = new CoffeeMachine(coffeeContainer, waterContainer);}@Afterpublic void tearDown() {coffeeContainer = null;waterContainer = null;coffeeMachine = null; }@Testpublic void testMakeCoffe() throws NotEnoughException {EasyMock.expect(coffeeContainer.getPortion(Portion.LARGE)).andReturn(true);EasyMock.replay(coffeeContainer);EasyMock.expect(waterContainer.getPortion(Portion.LARGE)).andReturn(true);EasyMock.replay(waterContainer);assertTrue(coffeeMachine.makeCoffee(Portion.LARGE));}@Testpublic void testNotEnoughException() throws NotEnoughException {EasyMock.expect(coffeeContainer.getPortion(Portion.LARGE)).andReturn(false);EasyMock.replay(coffeeContainer);EasyMock.expect(waterContainer.getPortion(Portion.LARGE)).andReturn(true);EasyMock.replay(waterContainer);assertFalse(coffeeMachine.makeCoffee(Portion.LARGE));}}

在前面的代碼片段中,您可以看到JUnit和EasyMock的合作。 我可以強調EasyMock使用中的一些基本知識。

  • 如果測試需要與某個外部對象進行交互,則應對其進行模擬。 coffeeContainer = EasyMock.createMock(CoffeeContainer.class);
  • 設置模擬或具體方法的行為,這是測試被測對象所必需的。 EasyMock.expect(coffeeContainer.getPortion(Portion.LARGE)).andReturn(true);
  • 將模擬切換到回復模式。 EasyMock.replay(coffeeContainer);

    EasyMock的API有很多不同的方法,因此我建議在官方網站上內容。

  • JUnit測試套件

    當您有一個小型應用程序時,可以單獨啟動JUnit測試,但是如果您在大型復雜的應用程序上工作該怎么辦? 在這種情況下,可以通過某些功能將單元測試匯總到測試服中。 JUnit為此提供了便捷的方法。

    @RunWith(Suite.class) @SuiteClasses({ AbstractContainerTest.class, CoffeeMachineTest.class }) public class AllTests {}

    摘要

    單元測試是軟件開發中非常重要的一部分,它具有許多方法,方法和工具。 在這篇文章中,我對JUnit和EasyMock進行了概述,但是我忽略了許多有趣的時刻和技術,打算在以下教程中進行介紹。 您可以從我的DropBox下載該教程的源代碼 。

    參考:在Fruzenshtein的注釋博客中,我們的JCG合作伙伴 Alex Fruzenshtein的JUnit和EasyMock合作 。

    翻譯自: https://www.javacodegeeks.com/2013/03/junit-and-easymock-cooperation.html

    總結

    以上是生活随笔為你收集整理的JUnit与EasyMock合作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。