Junit

1.導(dǎo)入jar包:

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

2.編寫一個方法
在com.zzhblh.util包中創(chuàng)建一個類,類中有一個方法:

package com.zzhblh.util;
public class Math {

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

3.創(chuàng)建測試類,測試上面的方法:
接下來要對Math類進行單元測試。
創(chuàng)建一個和src同級別的文件夾叫test(邏輯代碼放src里,測試代碼放test里是個好習(xí)慣)。接著在IntelliJ IDEA里還要把這個test文件夾要設(shè)置成測試文件的根目錄,右鍵選中Mark Directory As - Test Sources Root。
然后創(chuàng)建com.zzhblh.util.MathTest類(包名一致,類名在要測試的類名后加上Test也是個好習(xí)慣)。

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運行一下,右下方一條綠色條說明測試通過,不通過顯色紅色條。

說明:

  • 導(dǎo)入了org.junit.Test;和org.junit.Assert.*;這兩個包,注意后者是靜態(tài)導(dǎo)入import static(可以直接使用靜態(tài)類中的方法,屬性。不必寫'類名.')。
  • testAdd是在要測試的方法名add前加個test(這也是個好習(xí)慣)。
  • 所有測試方法返回類型必須為void且無參數(shù)。
  • 一個測試方法之所以是個測試方法是因為@Test這個注解。
  • assertEquals的作用是判斷兩個參數(shù)是否相等。
  • assertEquals除了比較兩個int,還重載了好多次可以比較很多種類型的參數(shù)。而且JUnit4其他的assertXX方法。

幾個常用的注解:
@Test:把一個方法標記為測試方法
@Before:每一個測試方法執(zhí)行前自動調(diào)用一次
@After:每一個測試方法執(zhí)行完自動調(diào)用一次
@BeforeClass:所有測試方法執(zhí)行前執(zhí)行一次,在測試類還沒有實例化就已經(jīng)被加載,所以用static修飾
@AfterClass:所有測試方法執(zhí)行完執(zhí)行一次,在測試類還沒有實例化就已經(jīng)被加載,所以用static修飾
@Ignore:暫不執(zhí)行該測試方法
有測試類如下:

package com.zzhblh.util;

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

public class AnnotationTest {

    public AnnotationTest() {
        System.out.println("構(gòu)造方法");
    }

    @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");
    }

}

運行結(jié)果如下:

BeforeClass
構(gòu)造方法
Before
test1
After
構(gòu)造方法
Before
test2
After
AfterClass

你會發(fā)現(xiàn)構(gòu)造方法被執(zhí)行了兩次。因為JUnit4為了保證每個測試方法都是單元測試,是獨立的互不影響。所以每個測試方法執(zhí)行前都會重新實例化測試類。
可以把多個方法標記為@BeforeClass、@AfterClass、@Before、@After。他們都會在相應(yīng)階段被執(zhí)行。
@Test注解中可以加上timeout屬性,如@Test(timeout = 2000),單位為毫秒,表示說超出2秒將視為測試不通過。

4.自動生成測試類:
這里假設(shè)有更多方法需要測試,如果要一個一個寫,太累了。IntelliJ IDEA可以自動生成測試方法的基本結(jié)構(gòu)。按快捷鍵ctrl - shift - T。
彈出的對話框點擊Create New Test...

5.結(jié)合Spring:
可以在Before方法中,初始化Spring容器

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

但如上面提到的,每個測試方法執(zhí)行前都會重新實例化測試類,這樣導(dǎo)致容器被初始化多次。在測試Spring時我們可以使用Spring test。
導(dǎo)入jar包:

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

和上文一樣,推薦創(chuàng)建一個和src平級的源文件目錄test,而包的名稱可以和src中的目錄同名,這樣由于在test源目錄中,所以不會有沖突,而且名稱又一模一樣,也方便檢索。
基類:

@RunWith(SpringJUnit4ClassRunner.class)  //使用junit4進行測試  
@ContextConfiguration({"/spring/app*.xml","/spring/service/app*.xml"}) //加載配置文件  
  
//如果加入以下代碼,所有繼承該類的測試類都會遵循該配置,也可以不加,這個非常關(guān)鍵,如果不加入這個注解配置,事務(wù)控制就會失效  
@Transactional  
//這里的事務(wù)關(guān)聯(lián)到配置文件中的事務(wù)控制器(transactionManager = "transactionManager"),同時//指定自動回滾(defaultRollback = true)。這樣做操作的數(shù)據(jù)才不會污染數(shù)據(jù)庫!  
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
public class BaseJunit4Test {  
}  

自己的測試類:

public class UserAssignServiceTest extends BaseJunit4Test{  
  
    @Resource  //自動注入,默認按名稱  
    private IBaseDao baseDao;  
      
    @Test   //標明是測試方法  
    @Transactional   //標明此方法需使用事務(wù)  
    @Rollback(false)  //標明使用完此方法后事務(wù)不回滾,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用于回滾數(shù)據(jù)庫,能夠完成功能邏輯檢查,又能夠在測試完成后恢復(fù)現(xiàn)場,不會留下“后遺癥”。比如:用戶在測試方法中插入一條ID為1的User記錄,如果不回滾,第一次運行不會有問題,第二次運行時,就會因為主鍵沖突而導(dǎo)致測試用例失敗。


要點:
所有測試方法返回類型必須為void且無參數(shù)。因為JUnit4為了保證每個測試方法互不影響,所以每個測試方法執(zhí)行前都會重新實例化測試類,所以構(gòu)造方法會執(zhí)行多次。
幾個常用的注解:
@Test:把一個方法標記為測試方法
@Before:每一個測試方法執(zhí)行前自動都調(diào)用一次
@After:每一個測試方法執(zhí)行完自動都調(diào)用一次
@BeforeClass:所有測試方法執(zhí)行前執(zhí)行一次,在測試類還沒有實例化就已經(jīng)被加載,所以用static修飾
@AfterClass:所有測試方法執(zhí)行完執(zhí)行一次,在測試類還沒有實例化就已經(jīng)被加載,所以用static修飾
測試Spring
導(dǎo)入spring-test包。
配置注解:
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4進行測試
@ContextConfiguration({"/spring/app.xml","/spring/service/app.xml"}) //加載配置文件


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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