我們將從構建簡單的駝鹿監視軟件開始示例各種場景下的測試驅動開發
鹿是鹿家族中的最大個的成員
本文假設讀者已經熟悉java/ant/maven/classpath
Vanilla JUnit
首先編寫Moose類
package moose;
import java
public class Moose {
private Date dateTimeObserved;
private int age;
public Moose(Date dateTimeObservedParam
this
this
}
}
雖然駝鹿最長可以生存
單元測試如下
public void testIsOlderThan() {
Moose moose = new Moose(new Date()
assertTrue(
}
方法:
boolean isOlderThan(int contenderAge) {
return this
}
這是一個普通的junit測試用例
使用偽對象和jMock
觀察駝鹿的最佳時間是在黎明和黃昏
不幸地是
為了測試getObserverName()
public interface Ranger {
String getName();
}
這給我們第一個啟發式的單元測試
我們需要改變Moose的構造函數增加Ranger參數
private Ranger observer;
public Moose( Date dateTimeObservedParam
int estimatedAge
Ranger observedBy)
{
this
this
this
}
後面
這種我們通過硬編碼或定義方法調用異常的簡單實現方式被稱為偽對象
為了使用jMock
public class TestMoose extends MockObjectTestCase {
public void setUp() throws Exception {
super
}
public void tearDown() throws Exception {
super
}
使用jMock後
public void testObserverName() {
Mock rangerMock = mock(Ranger
rangerMock
Moose moose = new Moose(new Date()
assertEquals(
}
讓我們逐行地解釋一下
·Mock rangerMock = mock(Ranger
這行創建了一個Mock對象來偽裝Ranger接口的實現
·rangerMock
這裡是最有趣的地方
· Moose moose = new Moose(new Date()
這行創建Moose對象
·assertEquals(
最後是測試本身
注冊模式
駝鹿喜歡居住吃水池草
在項目中的消息系統是一個企業級的服務系統
讓我們用一個友好的接口來隱藏消息系統吧
public interface Messenger {
void sendMessage(String topic
}
現在是我們第二個啟發式的單元測試
現在
public class Registry {
private static Map registry = new HashMap();
public static void put(String key
registry
}
public static Object get(String key) {
return registry
}
}
在代碼中
Messenger messenger = (Messenger) Registry
messenger
跟著是測試用例
public void testMessageIsSent() {
Date observationDate = new Date();
Object[] valueArray = new Object[] { observationDate
Mock messenger = mock(Messenger
messenger
Registry
Moose moose = new Moose(observationDate
}
讓我們來看一下重要的幾行
· Mock messenger = mock(Messenger
創建一個實現Messenger接口的偽對象
·messenger
告訴偽對象期望sendMessage()方法只被調用一次
·Registry
注冊接口的偽實現
·Moose moose = new Moose(observationDate
最後是我們的測試
數據庫測試
我知道你可能會想
public interface StorageManager {
void save(Object objectToSave) throws StorageException;
}
將實現放在注冊表中
StorageManager storageManager = (StorageManager) Registry
storageManager
在這裡我們會用StorageException來封裝所有實現中的異常
不管用Hibernat
在我們的單元測試中
public void testSave() throws StorageException {
// Create a mock Messenger than ignores any messages it gets
Mock messenger = mock(Messenger
messenger
Registry
// Create the moose
Moose moose = new Moose(new Date()
// Create a mock StorageManager and tell it what will happen when we save the moose
Mock storage = mock(StorageManager
storage
Registry
// Test !
moose
}
讓我們來看一下重要部分
messenger
Jmock擁有一次或多次激活的樁
下一步
storage
這個看起來很直觀
最後我們保存的Moose:
moose
一旦測試完成
當我們實際的StorageManager實現時(如HibernateStorageManager)
小結
所有上面的測試用例可以從資源中下載
下面是我在本文中所關注的兩個重點
這兩個技巧會的用處就像單元測試的用處
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27956.html