1. 程式人生 > >經典三層框架初識(二)---Spring 2.4 spring整合Junit

經典三層框架初識(二)---Spring 2.4 spring整合Junit

一.Junit

  • Junit簡介

    • JUnit是一個Java語言的單元測試框架,用於單元測試.
    • 以前我們測試的時候,一般是單獨建立一個測試類,在裡面寫一個main方法來測試我們的程式,但是實質上這樣用main來做測試是不規範的,因為main方式它是一個應用程式的入口,它應該作為主邏輯來執行的,而我們的測試是輔助來做的.其次,一個類只有一個main方法(入口),如果我們現在有很多的程式碼需要測試怎麼辦?以前我們是封裝成很多方法,依次在main裡面呼叫或者是在main裡面測試完一個註釋掉寫下一個,那這樣很麻煩也有很多限制.而 Junit 能很好的解決這個問題,簡化單元測試,寫一點測一點,在編寫以後的程式碼中如果發現問題可以較快的追蹤到問題的原因,減小回歸錯誤的糾錯難度。
  • Junit的使用

    • 前提是我們需要匯入Junit的jar包.我們用的eclipse中已經繼承了Junit了,不需要我們去下載jar啦
    • 基本步驟:
      • ①:選中專案,右鍵Build Path--->Add Libraries...
      • ②:彈出來的Add Library介面中,找到 JUnit並選中,點選 next
      • ③:彈出的JUnit Library介面,我們在下來框中選擇JUnit4,最後點選finish就可以了.
    • 下面我們看一下程式碼
    • 下面是我們需要測試的類:
      • package test;
        
        public class Test2 {
        	
        	public void f(){
        		System.out.println("test");
        	}
        }
        

        如果我們需要測試上面的f方法,以前我們是下面這麼做的:

      • 	public static void main(){
        		Test2 test2 = new Test2();
        		test2.f();
        	}

        現在我們不用main方法,使用Junit來測試:

      •  

        我們只需要將需要測試的方面上面加上@Test即可.然後滑鼠放在需要測試的方法中,右鍵,Run As ---->JUnit Test.

         
        package test;
        
        import org.junit.Test;
        
        public class Test2 {
        	@Test
        	public void f(){
        		System.out.println("test");
        	}
        	
        }
        

        執行結果出現如下的綠色橫條,則測試通過,紅色橫條,則測試失敗

      •  

    • 上面是簡單模擬Junit的使用,這裡介紹Junit的幾個常用的類似於@Test的註解:

      • @Before: 每一個測試方法之前執行
      • @After: 每一個測試方法之後執行
      • @BeforeClass: 方法必須必須要是靜態方法(static 宣告),所有測試開始之前執行,注意區分before,是所有測試方法
      • @AfterClass: 方法必須要是靜態方法(static 宣告),所有測試結束之後執行,注意區分 @After
      • @Ignore: 被忽略的測試方法:加上之後,暫時不執行此段程式碼
    • 例如上面的例子,我們希望每個測試的方法前面都要先列印before,那麼我們可以下面這樣
    •   
    • 注意:編寫測試類的原則:

      • ①測試方法上必須使用@Test進行修飾
      • ②測試方法必須使用public void 進行修飾,不能帶任何的引數
      • ③新建一個原始碼目錄來存放我們的測試程式碼,即將測試程式碼和專案業務程式碼分開
      • ④測試類所在的包名應該和被測試類所在的包名保持一致
      • ⑤測試單元中的每個方法必須可以獨立測試,測試方法間不能有任何的依賴
      • ⑥測試類使用Test作為類名的字尾(不是必須)
      • ⑦測試方法使用test作為方法名的字首(不是必須)
  • 二.Spring整合Junit

    • 下面看我們下面的程式碼
    • package test;
      
      import org.springframework.beans.factory.annotation.Autowired;
      
      import service.UserService;
      
      public class Test {
      	@Autowired
      	UserService servie;
      	
      	@org.junit.Test
      	public void test(){
      	    servie.addUser();
      	    servie.deleteUser();
      	}
      	
      	/*public static void main(String[] args) {
      
      		ApplicationContext ac = 
      				new ClassPathXmlApplicationContext("applicationContext.xml");
      		UserService service = ac.getBean("userservice", UserService.class);
      		service.addUser();
      		service.deleteUser();
      	}*/
      
      }
      

      上面的程式碼時我們前面從容器獲取UserService物件用到的.我們有這樣的思考,UserService這個物件我們的spring中上下文已經通過對包的掃描得到了(也就是它已經在我們的容器中被管理了),那我們能否不需要main方法,通過Junit和依賴注入的方式測試test這個方法呢?但是上面的程式碼能否執行成功呢?答案肯定是不能的.因為我們要把UserService這個成員變數注入的話,有個前提是我們得先把上下文載入了.這裡面上下文都沒有呢,怎麼注入呢?這個時候我們就可以使用spring整合Junit,讓它來實現上下文的載入然後再注入.  

    •  

      spring整合Junit的前提:需要匯入一個spring-test-XX.jar的jar包.

      package test;
      
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      
      import service.Userservice;
      
      @RunWith(SpringJUnit4ClassRunner.class)//執行器
      @ContextConfiguration(locations="classpath:applicationContext.xml")//載入配置檔案,咱們的配置檔案在src下,所以這裡寫classpath
      public class Test {
      
      	@Autowired
      	Userservice service;
      	
      	@org.junit.Test
      	public void test(){
      		service.addUser();
      		service.deleteUser();
      	}
      }
      

      這裡注意兩點:我們的執行器是spring整合Junit的執行器;另外一個在我們注入成員變數的物件之前,要載入配置檔案,因為載入了配置檔案,才回去掃描這個物件是否在我們容器中管理,只有在管理了並且拿到這個容器之後才能注入.