spring最大的特色就是全面使用annotation代替xml配置包括IOC ContainerspringMVC和 TestContext測試框架等給我們開發帶來了極大的便利springMVC的新特性在這篇文章裡面已經有了比較詳盡的介紹而對於spring的新TestContext測試框架大家也可以從這裡得到詳細的例子說明有興趣的可以去仔細閱讀本文不再贅述總而言之通過spring提供的 annotation我們可以讓我們的類——包括controllerTest等職責特殊的類——更 POJO 化更易於測試也提高了 TestCase的開發效率
在開發過程中我們通常需要mock特定的對象來測試預期行為或者使用stub對象來提高單元測試效率最常見的例子就是在多層webapp中在controller類的測試方法裡mock或 stub底層dao類的方法從而減輕單元測試時數據庫操作的開銷加快單元測試速率至於Reflection已不是java的新概念了各樣框架基本上都有使用Reflection來增強Runtime的動態性而java裡Reflection效率的提升和annotation的引入更是極大地提高java語言的動態性讓開發人員得到更多Runtime的靈活性本文將演示如何使用spring和Reflection簡化測試中的 mock使用的JUnit框架是JUnitmock框架是Easymock
讓我們先看看最原始的使用mock對象的測試(假設基於jdk進行開發使用了包括static importvarargs等新特性)
import static orgeasymockEasyMock*;
public void HelloworldTest extends AbstractSingleSpringContextTests {
private Foo foo = createMock(Fooclass);
private Bar bar = createMock(Barclass);
private Helloworld helloworld;
@Before
public void before() {
reset(foo bar);
helloworld = new Helloworld(foo bar);
}
@After
public void after() {
verify(foo bar);
}
@Test
public void shouldSayHello() {
//set expectations about foo/bar
replay(foo bar);
helloworldsayHello();
//assert verification
}
//
}
可以看到因為使用了 Spring 老版本的 TestContext上面的代碼至少有兩個方面是需要加強的
需要大量的 mock 對象創建操作與真正的 Test Case 無關的繁瑣代碼而且還引入了對Spring Context Test 類的繼承依賴
針對不同的 Test 類因為用到不同的 mock 對象每次都需要顯式去指明 reset/replay/verify 用到的 mock 對象
針對上面的兩個問題我們有相應的解決方案來改進
使用spring來替我們創建mock對象由spring IOC Container在runtime注入需要的mock對象
提供更通用的rest/replay/verify機制來驗證mock對象而不是每個 Test 類都需要單獨處理
[] [] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29006.html