熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring應用的單元測試

2013-11-23 20:39:10  來源: Java開源技術 
    單元測試現在越來越被廣泛重視起來而Spring更是將時下比較流行的Junit開元測試框架進行整合下面我簡單的介紹一下在Sping中該如何對代碼進行單元測試(本節會認為讀者已經具備了Junit基礎方面的知識)按照Spring的推薦在單元測試時不應該依賴於Spring容器也就是說不應該在單元測試是啟動ApplicationContext並從中獲取Bean相反應該通過模擬對象完成單元測試而Spring就提供了這樣一個類供大家繼承下面來看看示例代碼
   
    )自動裝配的測試用例
   
    代碼清單
   
    import orgspringframeworkbeansfactoryannotationAutowired;
   
    import orgspringframeworkstereotypeService;
   
    import comtonywebdaoFooDao;
   
    @Service
   
    public class FooService {
   
    @Autowired
   
    private FooDao dao;
   
    public String save(String name){
   
    if(name == null || equals(name))
   
    throw new RuntimeException(Name is null
   
    return daosave(name)
   
    }
   
    }
   
    import orgspringframeworkstereotypeRepository;
   
    @Repository
   
    public class FooDao {
   
    public String save(String name){
   
    return success;
   
    }
   
    }
   
    import orgspringframeworktest
   
    AbstractDependencyInjectionSpringContextTests;
   
    import comtonywebserviceFooService;
   
    public class MyTest extends AbstractDependencyInjectionSpringContextTests{
   
    protected FooService fooService;
   
    //set方法
   
    public void setFooService(FooService fooService) {
   
    thisfooService = fooService;
   
    }
   
    //指定Spring配置文件的位置
   
    protected String[] getConfigLocations(){
   
    return new String[]{springconfigbeansxml};
   
    }
   
    //測試方法
   
    public void testSave(){
   
    String str = thisfooServicesave(Tony
   
    Systemoutprint(str)
   
    assertEquals(success str)
   
    }
   
    }
   
    <?xml version= encoding=UTF?>
   
    <beans xmlns=//…>
   
    <context:componentscan basepackage=comtony/>
   
    </beans>
   
    代碼清單中定義了FooServicejava和FooDaojava兩個Bean已經使用 @Autowired進行了裝配我們的單元測試類MyTest繼承了
   
    AbstractDependencyInjectionSpringContextTests類配置好fooService的set方法並且指定Spring配置文件的位置後當測試用例運行時我們需要的fooService會自動注入進來我們只要在testSave方法中直接使用就可以了還有兩外一種寫法
   
    代碼清單
   
    public class MyTest extends AbstractDependencyInjectionSpringContextTests{
   
    protected FooService fooService;
   
    public MyTest(){
   
    //啟用直接對屬性變量進行注入的機制
   
    thissetPopulateProtectedVariables(true)
   
    }
   
    protected String[] getConfigLocations(){
   
    return new String[]{springconfigbeansxml};
   
    }
   
    public void testSave(){
   
    String str = thisfooServicesave(Tony
   
    Systemoutprint(str)
   
    assertEquals(success str)
   
    }
   
    }
   
    代碼清單中我們移除了set方法增加了一個構造函數在構造函數中調用父類的方法啟用直接對屬性變量進行注入的機制有時我們測試的時候會操作數據庫插入一條記錄由於我們不會每次都修改測試的數據當我們再次插入同樣的數據時數據庫肯定會要報錯了此時我們需要既能測試又能不讓測試的數據在數據庫中起作用Spring就知道我們的這個需要為我們准備了AbstractTransactionalSpringContextTests這個類
   
    代碼清單
   
    import orgspringframeworktest
   
    AbstractTransactionalSpringContextTests;
   
    import comtonywebserviceFooService;
   
    public class MyTest extends AbstractTransactionalSpringContextTests{
   
    protected FooService fooService;
   
    public MyTest(){
   
    thissetPopulateProtectedVariables(true)
   
    }
   
    protected String[] getConfigLocations(){
   
    return new String[]{springconfigbeansxml};
   
    }
   
    //測試方法中的數據操作將在方法返回前被回滾不會對數據庫產生永久性數據操作下一//次運行該測試方法時依舊可以成功運行
   
    public void testSave(){
   
    String str = thisfooServicesave(Tony
   
    Systemoutprint(str)
   
    assertEquals(success str)
   
    }
   
    }
   
    這樣就可以在方法返回之前將測試數據回滾以保證下次單元測試的成功
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28838.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.