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"}) //加載配置文件