Junit4使用實(shí)例

一、開胃示例

被測(cè)試類——獲取學(xué)生數(shù)據(jù):

/**
 * 學(xué)生信息實(shí)體
 */
public class EStudent{
  String name;
   int age;
   // 一堆getter、setter

   /**
    * 注意:自定義類時(shí)要重寫equals方法,否則默認(rèn)equals方法會(huì)使用==方式來(lái)比較對(duì)象的內(nèi)存地址是否相同裳瘪,而不是內(nèi)容是否相同。
    */
   @Override
   public boolean equals(Object obj){
     if (obj == null || obl.getClass() != this.getClass()) return false;
     
     EStudent other = (EStudent)obj;
     if (!this.getName().equals(other.getName())
              || this.getAge() != other.getAge()) return false;
     return true;
   }
}

/**
  * 學(xué)生數(shù)據(jù)操作接口
  */
public interface StudentDao{
  public EStudent getStudent(int id);
}

/**
 * 真實(shí)的數(shù)據(jù)操作類
 */
public class StudentDaoImpl 
  implements StudentDao{

  public EStudent getStudent(int id){
       EStudent ret = new EStudent();
       ret.setName("fsjohnhuang");
       ret.setAge(18);
    
       return ret;
  }
}

/**
 * 模擬的數(shù)據(jù)操作類
 */
public class MockStudentDaoImpl 
  implements StudentDao{

  public EStudent getStudent(int id){
       EStudent ret = new EStudent();
       ret.setName("fsjohnhuang");
       ret.setAge(18);
    
       return ret;
  }
}

測(cè)試用例:

/**
 * 由于下面采用參數(shù)化測(cè)試罪针,因此將測(cè)試運(yùn)行器更換為Parameterized
 */
@RunWith(Parameterized.class)
public class TestStudentDao{
  static StudentDao dao, mockDao;

  /**
   * 執(zhí)行測(cè)試類中所有測(cè)試前執(zhí)行一次
   * 用于前提條件的初始化
   */
  @BeforeClass
  public static void init(){
      dao = new StudentDaoImpl();
      mockDao = new MockStudentDaoImpl();
  }
  
  /**
   * 接收測(cè)試用數(shù)據(jù)
   */
  int id;
  public TestStudentDao(int id){
    this.id = id;
  }

  /**
   * 測(cè)試用例
   */
  @Test
  public void testGetStudent(){
    assertEquals("獲取學(xué)生信息", mockDao.getStudent(id), dao.getStudent(id));
  }

  /**
   * 測(cè)試用數(shù)據(jù)提供方法
   */
  @Parameters
  public Collection dataFeed(){
    return Arrays.asList(new Object[][]{{1},{2},{3}});
  }
}

二彭羹、固件測(cè)試

就是每個(gè)測(cè)試方法執(zhí)行前和后都執(zhí)行的方法,用于自動(dòng)初始化和回收資源等工作泪酱。通過(guò) @Before 注解標(biāo)注測(cè)試方法執(zhí)行前調(diào)用的固件測(cè)試派殷,通過(guò) @After 注解標(biāo)注測(cè)試方法執(zhí)行后調(diào)用的固件測(cè)試。

父類的固件測(cè)試會(huì)在子類的固件測(cè)試前被調(diào)用墓阀。

另外可通過(guò)注解 @BeforeClass 和 @AfterClass 標(biāo)注某些static方法為測(cè)試開始前和結(jié)束后被調(diào)用毡惜,用于自動(dòng)初始化和回收資源等工作。注意通過(guò)注解 @BeforeClass 和 @AfterClass 標(biāo)注的方法一次測(cè)試過(guò)程僅被調(diào)用一次而已斯撮。

示例如下:

public class MyUT{
  int i, j;
  @BeforeClass public void static init(){
    System.out.println("init");
    i = 0;
    j = 0;
  }
  
  @Before public void invokeBefore(){
    System.out.println("invokeBefore" + ++i);
  }

  @Test public void testMyMethod1(){
    System.out.println("testMyMethod1");
  }

  @Test public void testMyMethod2(){
    System.out.println("testMyMethod2");
  }

  @After public void invokeAfter(){
    System.out.println("invokeAfter" + ++j);
  }

  @AfterClass public void static destroy(){
    System.out.println("destroy");
    i = 0;
    j = 0;
  }
}

// 輸出結(jié)果
init
invokeBefore1
testMyMethod1
invokeAfter1
invokeBefore2
testMyMethod2
invokeAfter2
destroy

三经伙、忽略測(cè)試用例

通過(guò)注解 @Ignore() 可以標(biāo)注不參與測(cè)試的測(cè)試方法。當(dāng)然也可以通過(guò)去除注解 @Test 來(lái)達(dá)到這個(gè)目的勿锅,但去除注解 @Test 會(huì)令到eclipse的JUnit View中無(wú)法顯示該測(cè)試方法帕膜。

四、異常測(cè)試

通過(guò)注解 @Test(expected=Class類型) 來(lái)標(biāo)注期待測(cè)試方法執(zhí)行時(shí)拋出哪種異常對(duì)象溢十,若測(cè)試方法不拋出異晨迳玻或異常對(duì)象與期待的異常對(duì)象不相同則測(cè)試失敗。

@Test(expected=ArithmeticException.class) 
public void calc(){
  int i = 1/0;
}

五张弛、超時(shí)測(cè)試

通過(guò)注解 @Test(timeout=毫秒數(shù)) 來(lái)標(biāo)注期待執(zhí)行測(cè)試方法的最大耗時(shí)危纫,若超時(shí)則測(cè)試失敗。

@Test(timeout=1000) 
public void wait(){
  while(true){}
}

六乌庶、測(cè)試運(yùn)行器

用于執(zhí)行JUnit中所有的測(cè)試方法。JUnit為單元測(cè)試提供默認(rèn)的測(cè)試運(yùn)行器契耿,但我們可以自定義瞒大,自定義的測(cè)試運(yùn)行器必須繼承 org.junit.runner.Runner 。然后通過(guò)類注解 @RunWith(CustomTestRunner.class) 來(lái)指定該測(cè)試的測(cè)試運(yùn)行器搪桂。

常用的內(nèi)置測(cè)試運(yùn)行器:

  1.  org.junit.runners.Suite 透敌,套件測(cè)試時(shí)使用盯滚。

2.  org.junit.runners.Parameterized ,參數(shù)化測(cè)試時(shí)使用酗电。

七魄藕、參數(shù)化測(cè)試

就是第一節(jié)中的測(cè)試類型,用于模擬以不同的參數(shù)組合來(lái)對(duì)方法進(jìn)行多次測(cè)試撵术。若不使用參數(shù)化測(cè)試背率,該測(cè)試方法有N個(gè)不同的參數(shù)組合,則需要寫N個(gè)測(cè)試方法來(lái)測(cè)試嫩与。

// 需要使用Parameterized測(cè)試運(yùn)行器才可以
@RunWith(Parameterized.class)
public class MyUT{
  // 成員變量寝姿,用于存放測(cè)試用數(shù)據(jù)和測(cè)試期望值
  int orig;
  int expected;
  public MyUT(int orig, int expected){
    this.orig = orig;
    this.expected = expected;
  }
  
  @Test public void testMyMethod(){
      assertEquals(expected, orig + 1);
  }

  /**
   * 測(cè)試數(shù)據(jù)和測(cè)試期望值的提供方法
   * 必須用注解@Parameters標(biāo)注
   * 必須返回Collection類型數(shù)據(jù)
   */
  @Parameters public Collection dataFeed(){
    return Arrays.asList(new Object[][]{
      {1, 2},
      {2, 3},
      {3, 4}
    });
  }
}

八、套件測(cè)試

JUnit4去除JUnit3中套件測(cè)試注解划滋,而是通過(guò)另一形式提供套件測(cè)試饵筑。

套件測(cè)試就是按業(yè)務(wù)邏輯將測(cè)試類進(jìn)行分組,并以組為單位執(zhí)行單元測(cè)試处坪。

// 測(cè)試類1
public class MyUT1{
  @Test public void testMyMehthod1(){
    assertEquals(1,1);
  }
}
// 測(cè)試類2
public class MyUT2{
  @Test public void testMyMehthod2(){
    assertEquals(2,2);
  }
}
// 套件測(cè)試類
@RunWith(Suite.class)
@SuiteClass({MyUT1.class, MyUT2.class})
public class SuiteTest{
  // 必須有一個(gè)public根资,無(wú)參數(shù)的構(gòu)造函數(shù)。使用默認(rèn)的構(gòu)造函數(shù)也可以
  public SuiteTest(){}
}

九同窘、JUnit4.4的 assertThat斷言

JUnit4.4內(nèi)置Hamcrest測(cè)試組件的部分內(nèi)容玄帕,而 assertThat斷言 就是配置Hamcrest測(cè)試組件的匹配符來(lái)實(shí)現(xiàn)所有測(cè)試工作。由于Hamcrest的匹配符貼近自然語(yǔ)言塞椎,因此意思表達(dá)更明確桨仿。(JUnit4.4前的版本則需要引入hamcrest-core.jar和hamcrest-library.jar了)。

/* assertThat語(yǔ)法
 * assertThat(T actual, Matcher<T> matcher);
 * assertThat(String reason, T actual, Matcher<T> matcher);
 * 入?yún)ctual為實(shí)際值案狠,入?yún)atcher為期待值的匹配符
 */

//測(cè)試變量是否大于指定值
assertThat(1, greaterThan(50));
//測(cè)試變量是否小于指定值
assertThat(1, lessThan(100));
//測(cè)試變量是否大于等于指定值
assertThat(1, greaterThanOrEqualTo(50));
//測(cè)試變量是否小于等于指定值
assertThat(1, lessThanOrEqualTo(100));
                  
//測(cè)試所有條件必須成立
assertThat(1, allOf(greaterThan(50),lessThan(100)));
//測(cè)試只要有一個(gè)條件成立
assertThat(1, anyOf(greaterThanOrEqualTo(50), lessThanOrEqualTo(100)));
//測(cè)試無(wú)論什么條件成立(還沒(méi)明白這個(gè)到底是什么意思)
assertThat(1, anything());
//測(cè)試變量值等于指定值
assertThat(1, is(100));
//測(cè)試變量不等于指定值
assertThat(1, not(50));

/**字符串**/
String url = "http://www.taobao.com";
//測(cè)試變量是否包含指定字符
assertThat(url, containsString("taobao"));
//測(cè)試變量是否已指定字符串開頭
assertThat(url, startsWith("http://"));
//測(cè)試變量是否以指定字符串結(jié)尾
assertThat(url, endsWith(".com"));
//測(cè)試變量是否等于指定字符串
assertThat(url, equalTo("http://www.taobao.com"));
//測(cè)試變量再忽略大小寫的情況下是否等于指定字符串
assertThat(url, equalToIgnoringCase("http://www.taobao.com"));
//測(cè)試變量再忽略頭尾任意空格的情況下是否等于指定字符串
assertThat(url, equalToIgnoringWhiteSpace("http://www.taobao.com"));

/**集合**/
List<User> user = new ArrayList<User>();
user.add(test1);
user.add(test2);
                  
//測(cè)試集合中是否還有指定元素
assertThat(user, hasItem(test1));
assertThat(user, hasItem(test2));
  
/**Map匹配**/
Map<String,User> userMap = new HashMap<String,User>();
userMap.put(test1.getUsername(), test1);
userMap.put(test2.getUsername(), test2);
                  
//測(cè)試map中是否還有指定鍵值對(duì)
assertThat(userMap, hasEntry(test1.getUsername(), test1));
//測(cè)試map中是否還有指定鍵
assertThat(userMap, hasKey(test2.getUsername()));
//測(cè)試map中是否還有指定值
assertThat(userMap, hasValue(test2));

十服傍、 assumeThat假設(shè)斷言

位于 org.junit.Assume類 下,同樣是屬于Hamcrest組件的骂铁。用于假設(shè)當(dāng)條件成立時(shí)才會(huì)執(zhí)行后續(xù)的代碼吹零,條件不成立時(shí)是不會(huì)影響測(cè)試結(jié)果。

assumeThat(1, is(0));
System.out.println("I'm here"); // 這句不會(huì)被執(zhí)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拉庵,一起剝皮案震驚了整個(gè)濱河市灿椅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钞支,老刑警劉巖茫蛹,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烁挟,居然都是意外死亡婴洼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門撼嗓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柬采,“玉大人欢唾,你說(shuō)我怎么就攤上這事》勰恚” “怎么了礁遣?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肩刃。 經(jīng)常有香客問(wèn)我祟霍,道長(zhǎng),這世上最難降的妖魔是什么树酪? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任浅碾,我火速辦了婚禮,結(jié)果婚禮上续语,老公的妹妹穿的比我還像新娘垂谢。我一直安慰自己,他們只是感情好疮茄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布滥朱。 她就那樣靜靜地躺著,像睡著了一般力试。 火紅的嫁衣襯著肌膚如雪徙邻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天畸裳,我揣著相機(jī)與錄音缰犁,去河邊找鬼。 笑死怖糊,一個(gè)胖子當(dāng)著我的面吹牛帅容,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伍伤,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼并徘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扰魂?” 一聲冷哼從身側(cè)響起麦乞,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劝评,沒(méi)想到半個(gè)月后姐直,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒋畜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年简肴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片百侧。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砰识,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佣渴,到底是詐尸還是另有隱情辫狼,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布辛润,位于F島的核電站膨处,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏砂竖。R本人自食惡果不足惜真椿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乎澄。 院中可真熱鬧突硝,春花似錦、人聲如沸置济。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浙于。三九已至护盈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羞酗,已是汗流浹背腐宋。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留檀轨,地道東北人胸竞。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像裤园,于是被迫代替她去往敵國(guó)和親撤师。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理拧揽,服務(wù)發(fā)現(xiàn)剃盾,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1.初級(jí)篇 1.1 單元測(cè)試 我們?cè)诰帉懘笮统绦虻臅r(shí)候淤袜,需要寫成千上萬(wàn)個(gè)方法或函數(shù)痒谴,這些函數(shù)的功能可能很強(qiáng)大,但我...
    流川楓AI閱讀 2,465評(píng)論 0 8
  • JUnit Intro Android基于JUnit Framework來(lái)書寫測(cè)試代碼铡羡。JUnit是基于Java語(yǔ)...
    chandarlee閱讀 2,263評(píng)論 0 50
  • 感謝原作者的奉獻(xiàn)积蔚,原作者博客地址:http://blog.csdn.net/zhu_ai_xin_520/arti...
    狼孩閱讀 14,056評(píng)論 1 35
  • JUnit是一個(gè)開源的java自動(dòng)化單元測(cè)試框架。由 Erich Gamma 和 Kent Beck 與1997年...
    zhaozhiwen閱讀 2,079評(píng)論 2 13