JUnit 入門踩坑排錯(cuò)

References:

  1. http://mark-yang.github.io/blog/2015/05/17/junit/
  2. JUnit官方

Introduction

簡(jiǎn)單介紹一下概念研儒。

所謂測(cè)試用例

  1. 從開發(fā)的角度枝冀,所謂測(cè)試用例靶橱,主要是方便在開發(fā)斯撮、重構(gòu)過(guò)程中俊柔,對(duì)代碼邏輯、編輯條件的一些測(cè)試梗醇。
  2. 如果不使用測(cè)試用例的寫法冶匹,可以每個(gè).java文件都寫一個(gè)main方法進(jìn)行測(cè)試。
  3. 然而虽风,main方法測(cè)試的手段棒口,low,并且不利于重用辜膝。
  4. 于是无牵,在java中,常用JUnit框架厂抖,對(duì)代碼進(jìn)行測(cè)試茎毁。

Java中測(cè)試基本概念

  1. 測(cè)試單元:對(duì)一個(gè)類進(jìn)行測(cè)試。
  2. 建議僅對(duì)public方法進(jìn)行測(cè)試忱辅。

JUnit 踩坑

安裝

下載 JUnit-xxx.jar (下載地址) 和 Hamcrest(點(diǎn)擊直接下載) 充岛,放在一個(gè)文件夾下

第一個(gè)測(cè)試用例

  1. 按照官方推薦,編寫一個(gè)java類
public class Calculator {
  public int evaluate(String expression) {
    int sum = 0;
    for (String summand: expression.split("\\+"))
      sum += Integer.valueOf(summand);
    return sum;
  }
}
  1. 編譯這個(gè)文件
javac Calculator.java

目錄下出現(xiàn) Calculator.class

  1. 然后編寫一個(gè)Test.java文件
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}
  1. 編譯Test.java
# Linux or MacOS
javac -cp .:junit-4.XX.jar:hamcrest-core-1.3.jar CalculatorTest.java

# Windows
javac -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar CalculatorTest.java
  1. 運(yùn)行測(cè)試用例
# Linux or MacOS
java -cp .:junit-4.XX.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest

# Windows
java -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest

# 以下為輸出:
JUnit version 4.12
.
Time: 0.006

OK (1 test)
  1. 讓測(cè)試用例失敗
    Test.java中修改assert相關(guān)項(xiàng)耕蝉,重復(fù) 4-5,輸出如下:
JUnit version 4.12
.E
Time: 0.006
There was 1 failure:
1) evaluatesExpression(CalculatorTest)
java.lang.AssertionError: expected:<8> but was:<6>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:834)
    ...
FAILURES!!!
Tests run: 1,  Failures: 1:

結(jié)合 Intellij IDEA

  1. 先隨便寫個(gè)類夜只,拿來(lái)測(cè)試
package fc.learn.java.junit;

public class BaobaoFeng {

    public void awei18shi(){
        laohanTuiche();
        guanyinzuolian();
        zhongchu();
        dulongzuan();
    }

    public void laohanTuiche(){
        System.out.println("laohantuiche!");
    }

    private void guanyinzuolian(){
        System.out.println("guanyinzuolian!");
    }

    private int zhongchu(){
        return 1;
    }

    public String dulongzuan(){
        return "dulongzuan!";
    }

    public String lianxuzhongchu(int param){
        if (param < 5){
            throw new IllegalArgumentException("test exception!");
        }
        return "lianxuzhongchu";
    }

}
  1. 在類名 BaobaoFeng 出垒在,點(diǎn)開 quickLips:
    image

    直接點(diǎn)擊create:
    image

    完成,就建立了一個(gè)BaobaoFengTest.java扔亥〕∏可以看到,這里不支持private方法的旅挤。
package fc.learn.java.junit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class BaobaoFengTest {

    BaobaoFeng fengbaobao;

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void awei18shi() {
    }

    @Test
    public void laohanTuiche() {
    }

    @Test
    public void dulongzuan() {
    }

    @Test
    public void lianxuzhongchu(){
    }
}
  1. 要測(cè)試哪個(gè)方法踢关,就在Test.java中的對(duì)應(yīng)方法編寫測(cè)試用例,然后右鍵運(yùn)行即可粘茄。
    比如我要測(cè)試dulongzuan()方法的返回值签舞,可以如下:
    image

    image

    image

用JUnit測(cè)試web項(xiàng)目中DAO層

  1. 和上一節(jié)中的步驟2相同,可以在 Interface 上打開 quickTips柒瓣,自動(dòng)創(chuàng)建Test文件儒搭。
  2. 在Class前加@RunWith@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/config/context/appcontext-*.xml")

public class TryJunitDaoTest {

    @Autowired
    TryJunitDao tryJunitDao;

    @Test
    @Transactional  //  此處加上Transactional注解,測(cè)試完成之后會(huì)回滾
    public void insert() {
        TryJunitDto dto = new TryJunitDto();
        tryJunitDao.insert(dto)
    }

    @Test
    public void select() {
        TryJunitDto dto = tryJunitDao.select();
        Assert.assertNotEquals(dto, null);
    }
}

用 JUnit 模擬請(qǐng)求

實(shí)際上,模擬請(qǐng)求芙贫,關(guān)鍵是Mock搂鲫,和JUnit關(guān)系不是特別大。

  1. 同樣磺平,生成 Test.java 文件魂仍,然后
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:/config/spring/appcontext-*.xml",
        "file:src/main/webapp/WEB-INF/servlet-context.xml"
})
public class MockRequestControllerTest {
    @Autowired
    private MockRequestController mockRequestController;

    @Test
    public void testAcceptRequest() throws Exception {
        // 這里拐辽,構(gòu)造 MockRequest
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setAttribute("user", "user");

        mockRequestController.acceptRequest(request);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市擦酌,隨后出現(xiàn)的幾起案子俱诸,更是在濱河造成了極大的恐慌,老刑警劉巖仑氛,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乙埃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锯岖,警方通過(guò)查閱死者的電腦和手機(jī)介袜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)出吹,“玉大人遇伞,你說(shuō)我怎么就攤上這事〈防危” “怎么了鸠珠?”我有些...
    開封第一講書人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秋麸。 經(jīng)常有香客問(wèn)我渐排,道長(zhǎng),這世上最難降的妖魔是什么灸蟆? 我笑而不...
    開封第一講書人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任驯耻,我火速辦了婚禮,結(jié)果婚禮上炒考,老公的妹妹穿的比我還像新娘可缚。我一直安慰自己,他們只是感情好斋枢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開白布帘靡。 她就那樣靜靜地躺著,像睡著了一般瓤帚。 火紅的嫁衣襯著肌膚如雪描姚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評(píng)論 1 291
  • 那天缘滥,我揣著相機(jī)與錄音轰胁,去河邊找鬼。 笑死朝扼,一個(gè)胖子當(dāng)著我的面吹牛赃阀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼榛斯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼观游!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驮俗,我...
    開封第一講書人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懂缕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后王凑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搪柑,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年索烹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了工碾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡百姓,死狀恐怖渊额,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垒拢,我是刑警寧澤旬迹,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站求类,受9級(jí)特大地震影響奔垦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尸疆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一宴倍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仓技,春花似錦、人聲如沸俗他。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兆衅。三九已至地沮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羡亩,已是汗流浹背摩疑。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畏铆,地道東北人雷袋。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辞居,于是被迫代替她去往敵國(guó)和親楷怒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛋勺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)鸠删,斷路器抱完,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 2016年的長(zhǎng)假正式“用”完了巧娱!今年剩下的時(shí)間里,除了周末烘贴,再也沒有假期了禁添。趁著周末假期,趁著秋高氣爽庙楚,我們說(shuō)走就...
    樽伯活竹酒閱讀 358評(píng)論 2 0
  • 最近又懶了上荡,沒有記下什么。最近大雨會(huì)說(shuō)好多三個(gè)字了馒闷±壹瘢滑(板)車。還有表達(dá)‘回家’纳账,吃nainai逛薇,脫。 早上一般七...
    大雨不愁閱讀 129評(píng)論 0 0