JUnit 入门踩坑排错

References:

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

Introduction

简单介绍一下概念。

所谓测试用例

  1. 从开发的角度,所谓测试用例,主要是方便在开发、重构过程中,对代码逻辑、编辑条件的一些测试。
  2. 如果不使用测试用例的写法,可以每个.java文件都写一个main方法进行测试。
  3. 然而,main方法测试的手段,low,并且不利于重用。
  4. 于是,在java中,常用JUnit框架,对代码进行测试。

Java中测试基本概念

  1. 测试单元:对一个类进行测试。
  2. 建议仅对public方法进行测试。

JUnit 踩坑

安装

下载 JUnit-xxx.jar (下载地址) 和 Hamcrest(点击直接下载) ,放在一个文件夹下

第一个测试用例

  1. 按照官方推荐,编写一个java类
public class Calculator {
  public int evaluate(String expression) {
    int sum = 0;
    for (String summand: expression.split("\\+"))
      sum += Integer.valueOf(summand);
    return sum;
  }
}
  1. 编译这个文件
javac Calculator.java

目录下出现 Calculator.class

  1. 然后编写一个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. 运行测试用例
# 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. 让测试用例失败
    Test.java中修改assert相关项,重复 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:

结合 Intellij IDEA

  1. 先随便写个类,拿来测试
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 出,点开 quickLips:
    image

    直接点击create:
    image

    完成,就建立了一个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. 要测试哪个方法,就在Test.java中的对应方法编写测试用例,然后右键运行即可。
    比如我要测试dulongzuan()方法的返回值,可以如下:
    image

    image

    image

用JUnit测试web项目中DAO层

  1. 和上一节中的步骤2相同,可以在 Interface 上打开 quickTips,自动创建Test文件。
  2. 在Class前加@RunWith@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/config/context/appcontext-*.xml")

public class TryJunitDaoTest {

    @Autowired
    TryJunitDao tryJunitDao;

    @Test
    @Transactional  //  此处加上Transactional注解,测试完成之后会回滚
    public void insert() {
        TryJunitDto dto = new TryJunitDto();
        tryJunitDao.insert(dto)
    }

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

用 JUnit 模拟请求

实际上,模拟请求,关键是Mock,和JUnit关系不是特别大。

  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 {
        // 这里,构造 MockRequest
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setAttribute("user", "user");

        mockRequestController.acceptRequest(request);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 2016年的长假正式“用”完了!今年剩下的时间里,除了周末,再也没有假期了。趁着周末假期,趁着秋高气爽,我们说走就...
    樽伯活竹酒阅读 357评论 2 0
  • 最近又懒了,没有记下什么。最近大雨会说好多三个字了。滑(板)车。还有表达‘回家’,吃nainai,脱。 早上一般七...
    大雨不愁阅读 129评论 0 0