Junit

1.导入jar包:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>

2.编写一个方法
在com.zzhblh.util包中创建一个类,类中有一个方法:

package com.zzhblh.util;
public class Math {

    /**
     * @param n
     * @return
     */
    public int add(int a, int b) throws Exception {
        return a+b;
}

3.创建测试类,测试上面的方法:
接下来要对Math类进行单元测试。
创建一个和src同级别的文件夹叫test(逻辑代码放src里,测试代码放test里是个好习惯)。接着在IntelliJ IDEA里还要把这个test文件夹要设置成测试文件的根目录,右键选中Mark Directory As - Test Sources Root。
然后创建com.zzhblh.util.MathTest类(包名一致,类名在要测试的类名后加上Test也是个好习惯)。

package com.zzhblh.util;

import org.junit.Test;
import static org.junit.Assert.*;

public class MathTest {

    @Test
    public void testAdd() throws Exception {
        assertEquals(11, new Math().add(5,6));
    }
}

然后选中MathTest类ctrl + shift + F10运行一下,右下方一条绿色条说明测试通过,不通过显色红色条。

说明:

  • 导入了org.junit.Test;和org.junit.Assert.*;这两个包,注意后者是静态导入import static(可以直接使用静态类中的方法,属性。不必写'类名.')。
  • testAdd是在要测试的方法名add前加个test(这也是个好习惯)。
  • 所有测试方法返回类型必须为void且无参数。
  • 一个测试方法之所以是个测试方法是因为@Test这个注解。
  • assertEquals的作用是判断两个参数是否相等。
  • assertEquals除了比较两个int,还重载了好多次可以比较很多种类型的参数。而且JUnit4其他的assertXX方法。

几个常用的注解:
@Test:把一个方法标记为测试方法
@Before:每一个测试方法执行前自动调用一次
@After:每一个测试方法执行完自动调用一次
@BeforeClass:所有测试方法执行前执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
@AfterClass:所有测试方法执行完执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
@Ignore:暂不执行该测试方法
有测试类如下:

package com.zzhblh.util;

import org.junit.*;
import static org.junit.Assert.*;

public class AnnotationTest {

    public AnnotationTest() {
        System.out.println("构造方法");
    }

    @BeforeClass
    public static void setUpBeforeClass() {
        System.out.println("BeforeClass");
    }

    @AfterClass
    public static void tearDownAfterClass() {
        System.out.println("AfterClass");
    }

    @Before
    public void setUp() {
        System.out.println("Before");
    }

    @After
    public void tearDown() {
        System.out.println("After");
    }

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

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

    @Ignore
    public void test3() {
        System.out.println("test3");
    }

}

运行结果如下:

BeforeClass
构造方法
Before
test1
After
构造方法
Before
test2
After
AfterClass

你会发现构造方法被执行了两次。因为JUnit4为了保证每个测试方法都是单元测试,是独立的互不影响。所以每个测试方法执行前都会重新实例化测试类。
可以把多个方法标记为@BeforeClass、@AfterClass、@Before、@After。他们都会在相应阶段被执行。
@Test注解中可以加上timeout属性,如@Test(timeout = 2000),单位为毫秒,表示说超出2秒将视为测试不通过。

4.自动生成测试类:
这里假设有更多方法需要测试,如果要一个一个写,太累了。IntelliJ IDEA可以自动生成测试方法的基本结构。按快捷键ctrl - shift - T。
弹出的对话框点击Create New Test...

5.结合Spring:
可以在Before方法中,初始化Spring容器

@Before  
 public void init() {  
      ApplicationContext ctx = new FileSystemXmlApplicationContext( "classpath:spring/spring-basic.xml");  
      baseDao = (IBaseDao) ctx.getBean("baseDao");  
      assertNotNull(baseDao);  
 }    

但如上面提到的,每个测试方法执行前都会重新实例化测试类,这样导致容器被初始化多次。在测试Spring时我们可以使用Spring test。
导入jar包:

<dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-test</artifactId>  
    <version> 3.2.4.RELEASE  </version>  
    <scope>provided</scope>  
</dependency>   

和上文一样,推荐创建一个和src平级的源文件目录test,而包的名称可以和src中的目录同名,这样由于在test源目录中,所以不会有冲突,而且名称又一模一样,也方便检索。
基类:

@RunWith(SpringJUnit4ClassRunner.class)  //使用junit4进行测试  
@ContextConfiguration({"/spring/app*.xml","/spring/service/app*.xml"}) //加载配置文件  
  
//如果加入以下代码,所有继承该类的测试类都会遵循该配置,也可以不加,这个非常关键,如果不加入这个注解配置,事务控制就会失效  
@Transactional  
//这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时//指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!  
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
public class BaseJunit4Test {  
}  

自己的测试类:

public class UserAssignServiceTest extends BaseJunit4Test{  
  
    @Resource  //自动注入,默认按名称  
    private IBaseDao baseDao;  
      
    @Test   //标明是测试方法  
    @Transactional   //标明此方法需使用事务  
    @Rollback(false)  //标明使用完此方法后事务不回滚,true时为回滚  
    public void insert( ) {  
            String sql="insert into user(name,password) values(?,?)";  
            Object[] objs=new Object[]{"00","000"};  
            baseDao.insert( sql , objs );  
          
            String sql1="select * from user where name=? and password=? ";  
            List<Map<String,Object>> list=baseDao.queryForList( sql1 , objs );  
            System.out.println(list);  
            assertTrue(list.size( )>0);   
    }  
}  

@Rollback用于回滚数据库,能够完成功能逻辑检查,又能够在测试完成后恢复现场,不会留下“后遗症”。比如:用户在测试方法中插入一条ID为1的User记录,如果不回滚,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例失败。


要点:
所有测试方法返回类型必须为void且无参数。因为JUnit4为了保证每个测试方法互不影响,所以每个测试方法执行前都会重新实例化测试类,所以构造方法会执行多次。
几个常用的注解:
@Test:把一个方法标记为测试方法
@Before:每一个测试方法执行前自动都调用一次
@After:每一个测试方法执行完自动都调用一次
@BeforeClass:所有测试方法执行前执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
@AfterClass:所有测试方法执行完执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
测试Spring
导入spring-test包。
配置注解:
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration({"/spring/app.xml","/spring/service/app.xml"}) //加载配置文件


参考:
http://blog.csdn.net/bruce128/article/details/9792283

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

推荐阅读更多精彩内容