您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
JUnit + Mockito單元測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2016/12/29 11:43:39 ] 推薦標(biāo)簽:單元測(cè)試 Junit

  JUnit 是 2015 年 Java 開(kāi)發(fā)者引用多的庫(kù),是 Java 單元測(cè)試框架里無(wú)可爭(zhēng)議的 No.1。JUnit 基本上能覆蓋大部分接口的測(cè)試,但如果待測(cè)接口依賴外部服務(wù),比如我之前寫(xiě)的這篇小文里描述的情況,JUnit 可能捉襟見(jiàn)肘了。而 Mockito 在 Mock 數(shù)據(jù)方面功能強(qiáng)大,正好彌補(bǔ)了 JUnit 在這方面的不足。風(fēng)云合璧,摩訶無(wú)量。
  上面其實(shí)已經(jīng)點(diǎn)到 JUnit 和 Mockito 的不同了,雖然二者都是運(yùn)用在單元測(cè)試中,但 JUnit 側(cè)重對(duì)接口的運(yùn)行狀態(tài)和結(jié)果的測(cè)試,而 Mockito 側(cè)重 “Mock” 數(shù)據(jù),即對(duì)對(duì)象的模擬,尤其是不容易構(gòu)造的復(fù)雜對(duì)象。
  JUnit + Mockito 組合的優(yōu)勢(shì)是顯而易見(jiàn)的,對(duì)于服務(wù)化的系統(tǒng),有了這個(gè)組合,能實(shí)現(xiàn)各上下游模塊并行開(kāi)發(fā),同時(shí)進(jìn)行單元測(cè)試驗(yàn)證可用性,減少串行聯(lián)調(diào)的時(shí)間。
  JUnit
  PS: 雖然 JUnit5 已經(jīng)發(fā)布,但目前使用多的還是 JUnit4,所以本文仍然基于 JUnit4。
  利用 Maven 初始化一個(gè)簡(jiǎn)單的 Java 應(yīng)用:
  mvn archetype:generate -DgroupId=com.isudox -DartifactId=test-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  Maven 會(huì)自動(dòng)創(chuàng)建好類(lèi)文件和測(cè)試類(lèi),路徑如下:
test-demo
├── pom.xml       ---- pom 依賴配置文件
└── src           ---- 源碼路徑
├── main      ---- 類(lèi)文件
│   └── java
│       └── com
│           └── isudox
│               └── App.java
└── test      ---- 測(cè)試類(lèi)
└── java
└── com
└── isudox
└── AppTest.java
  在 pom.xml 中引入 JUnit4,
<dependencies>
<!-- junit4 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
  引入 JUnit 依賴后,能在測(cè)試類(lèi)中,通過(guò) JUnit 提供的注解和靜態(tài)方法,對(duì)接口進(jìn)行測(cè)試了。先編寫(xiě)一個(gè)簡(jiǎn)單的待測(cè)試類(lèi) Calculator.java
// App.java
public classCalculator{
publicintevaluate(String expression)throwsException{
if (expression == null)
throw new Exception("null value");
int sum = 0;
for (String summand: expression.split("\+"))
sum += Integer.valueOf(summand);
return sum;
}
}
  然后在 src/test/ 路徑下創(chuàng)建同樣的包,將測(cè)試類(lèi)命名為 CalculatorTest.java,如果是用 IntelliJ IDEA,可以直接在待測(cè)試類(lèi)下通過(guò)快捷鍵 Ctrl+Shift+T 生成對(duì)應(yīng)的測(cè)試類(lèi)——
// CalculatorTest.java
import org.junit.Test;
import static org.junit.Assert.*;
public classCalculatorTest{
@Test
publicvoidevaluate()throwsException{
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
}
}
  執(zhí)行 mvn test ,反饋得接口運(yùn)行正確。
  在上面這段簡(jiǎn)單的代碼里,引入了 JUnit 的 @Test 注解和 Assert 下的系列靜態(tài)斷言方法。其中 @Test 注解把方法包裝為測(cè)試方法, assertEquals 方法用來(lái)斷言兩個(gè)入?yún)⑹欠褚恢隆Mㄟ^(guò)這個(gè)簡(jiǎn)單的例子實(shí)現(xiàn)了對(duì)待測(cè)方法的測(cè)試。
  JUnit 支持豐富的測(cè)試規(guī)則,除了 @Test 注解外,還有下面這些注解——
  @Before 注解的作用是使被標(biāo)記的方法在測(cè)試類(lèi)里每個(gè)方法執(zhí)行前調(diào)用;同理 After 使被標(biāo)記方法在當(dāng)前測(cè)試類(lèi)里每個(gè)方法執(zhí)行后調(diào)用。
  @BeforeClass 注解的作用是使被標(biāo)記的方法在當(dāng)前測(cè)試類(lèi)被實(shí)例化前調(diào)用;同理 @AfterClass 使被標(biāo)記的方法在測(cè)試類(lèi)被實(shí)例化后調(diào)用。
  @Ignore 注解的作用是使被標(biāo)記方法暫時(shí)不執(zhí)行。
  參考下面這段代碼的運(yùn)行:
import org.junit.*;
import static org.junit.Assert.*;
public classCalculatorTest{
publicCalculatorTest(){
System.out.println("Constructor");
}
@BeforeClass
publicstaticvoidbeforeThis()throwsException{
System.out.println("BeforeClass");
}
@AfterClass
publicstaticvoidafterThis()throwsException{
System.out.println("AfterClass");
}
@Before
publicvoidsetUp()throwsException{
System.out.println("Before");
}
@After
publicvoidtearDown()throwsException{
System.out.println("After");
}
@Test
publicvoidevaluate()throwsException{
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
System.out.println("Test evaluate");
}
@Test
publicvoididiot()throwsException{
assertTrue(true);
System.out.println("Test idiot");
}
@Ignore
publicvoidignoreMe()throwsException{
System.out.println("Ignore");
}
}
  測(cè)試結(jié)果如下,從輸出結(jié)果可以印證不同注解對(duì)執(zhí)行順序的影響:
  BeforeClass
  Constructor
  Before
  Test idiot
  After
  Constructor
  Before
  Test evaluate
  After
  AfterClass
  另外,每個(gè)測(cè)試方法執(zhí)行時(shí)都會(huì)實(shí)例化一次測(cè)試類(lèi),JUnit 這樣處理的原因是保證每個(gè)測(cè)試方法彼此獨(dú)立互不干擾。
  對(duì)于 @Test 注解標(biāo)記的方法, @Test 支持兩個(gè)參數(shù)的設(shè)置: timeout 和 expected 。前者是設(shè)置待測(cè)方法的執(zhí)行超時(shí)時(shí)間,后者是設(shè)置對(duì)待測(cè)方法期望的拋出異常。修改 evaluate 測(cè)試方法的注解:
  @Test(timeout = 100, expected = Exception.class)
  publicvoidevaluate()throwsException{
  Calculator calculator = new Calculator();
  int sum = calculator.evaluate(null);
  assertEquals(6, sum);
  i++;
  System.out.println("Test evaluate " + i);
  }
  Maven 運(yùn)行測(cè)試,從結(jié)果可以看到,方法拋出了異常,測(cè)試通過(guò)。
  Mockito
  相對(duì)于 JUnit,Mockito 則是 Mock 數(shù)據(jù)的測(cè)試框架,它簡(jiǎn)化了對(duì)有外部依賴的類(lèi)的單元測(cè)試。Mockito 的工作流程如下圖示( 圖片來(lái)源 ):

  首先在 pom.xml 中導(dǎo)入 mockito 依賴,
  pom.xml 依賴中添加 Mockito:
  <dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.2.0</version>
  <scope>test</scope>
  </dependency>

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd