1.pom.xml中加入
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.0.RELEASE</version> </dependency>
2.單元測試基本類
package com.hshbic.cloudapp.junit; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(value = SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:spring/*.xml"}) @Rollback(value=false) @Transactional(transactionManager="transactionManager") public class BaseJunitTest { @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("==============單元測試開始============="); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("==============單元測試結束============="); } }
注解說明:
1)@RunWith:用於指定junit運行環境,是junit提供給其他框架測試環境接口擴展,為了便於使用spring的依賴注入,spring提供了org.springframework.test.context.junit4.SpringJUnit4ClassRunner作為Junit測試環境
2) @ContextConfiguration({"classpath:applicationContext.xml","classpath:spring/buyer/applicationContext-service.xml"})
導入配置文件,這里我的applicationContext配置文件是根據模塊來分類的。如果有多個模塊就引入多個“applicationContext-service.xml”文件。如果所有的都是寫在“applicationContext.xml”中則這樣導入:
@ContextConfiguration(locations = "classpath:applicationContext.xml")
3) @Rollback 和 transactionManager @Rollback(新增注解)代替,其中只有一個屬性就是boolean型的value,作用沒變,值為true表示測試時如果涉及了數據庫的操作,那么測試完成后,該操作會回滾,也就是不會改變數據庫內容;值為false則與此相反,表示你測試的內容中對數據庫的操作會真實的執行到數據庫中,不會回滾。
4) 單元測試中setUp方法和setUpBeforeClass方法的區別
setUp方法原來是每個方法測試之前都會調用一次,而setUpBeforeClass則在整個類測試過程中只調用一次。同理,tearDown和tearDownAfterClass的方法也是在於此。setUpBeforeClass和tearDownAfterClass這兩個方法是在junit4中新增的,junit3中沒有。
5)創建基本單元測試類的目的是在父類加載了spring等配置文件,子類不需要再次加載,減少重復操作
3.單元測試子類
package com.hshbic.cloudapp.junit; import static org.junit.Assert.*; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; import com.hshbic.cloudapp.thirdserver.entity.CloudAppInfo; import com.hshbic.cloudapp.thirdserver.mapper.CloudAppInfoMapper; import com.hshbic.cloudapp.thirdserver.service.StatusDataPushService; @Rollback(value=true) public class StatusDataPushJunitTest extends BaseJunitTest{ @Autowired public StatusDataPushService service ; @Autowired CloudAppInfoMapper appMapper; @Test public void test() throws Exception { System.out.println("開始進行 test方式的測試"); String sign=""; sign=service.getSign("SV-RAIN001815-0000","938233258bd0b8aad67d2a5cdfe5bac1","20180710172055"); System.out.println("sign="+sign); } @Test public void insert() throws Exception { CloudAppInfo app= new CloudAppInfo(); app.setSystemId("SV-0000-0002"); app.setSystemKey_develop("develop"); app.setSystemKey_product("product"); System.out.println("開始進行 newTest方式的測試"); appMapper.insert(app); } }
1)@Rollback(value=true) 子類中覆蓋父類的事務
2)繼承父類,不需要再寫@RunWith @ContextConfiguration@Rollback 和 transactionManager 等配置;也不需要再寫setUpBeforeClass等方法