星期六, 4月 16, 2005

靠!EasyMock

靠!真的想自殺,居然誤解了 EasyMock 這麼久!
長久以來,寫 mock 我都是一直在 test case 裡寫個 static inner mock class,供各個 test 使用。當初學這套方法時也調查了很多 tool,但是都沒有完美的 solution,當時的 easymock 只能套在 interface 上,完全不合用。而 Dynamock / jMock 族系的需要繼承特殊的 TestCase,而且他的 "錄製" 過程中呼叫 method 是用 method name 的,像這樣:

mockSubscriber.expects(once()).method("receive").with( eq(message) );

天啊,Subscriber.receive() 的呼叫是用 String,這樣 refactor method name 時不就掛了!!而且真的很難看懂他在幹嘛。所以... 就打消使用 mock tool 的念頭了...
昨個亂逛居然發現 easymock 已經有 extension 可以用在 class 上了!而且還是去年就有了!看看下面的這幾行標準的 easymock 使用:

private MockControl control;

private OrderDAO mockOrderDAO;

protected void setUp() throws Exception {
//MockClassControl 可以替 class 建立 Mock
control = MockClassControl.createStrictControl(OrderDAO.class);
mockOrderDAO = (OrderDAO) control.getMock();
}

public void testSaveOrder() {
//開始預錄
Order order = new Order();
//執行真正的 method 來錄製,而不是用 method name
mockOrderDAO.saveOrder(order);
control.replay();
//錄製完成

OrderServiceImpl service = new OrderServiceImpl();
service.setOrderDAO(mockOrderDAO);
service.saveCustomerOrder(order);
//比對錄製結果
control.verify();
}
就是這麼簡單,唯一的限制是需要非 final 的 public constructor,不過這是小事啦!
居然一直停留在 mock tool 限制很多的印象裡... 該死!

靠~~~~

3 Comments:

At 4:25 下午, Anonymous 匿名 said...

mock object太易脆了,只要小改一個地方,就會出現red bar.

而且easy mock用起來太囉唆了,在real class 裡用到的method都要原封不動的mock一次,有時覺得好像同樣的程式結構寫了兩次(test code,src code),bad smell,而且寫出來的test code又臭又長(看一下spring的src code就知道了>___<).

不過,jmock之流的更難用:

mockSubscriber.expects(once()).method("receive").with( eq(message) );

易脆的一踏糊塗,根本是跟refactory過不去嘛(雖然jmock的creator一直強調用jmock寫出來的test不應該是易脆的.....>__<)

但測實際資料(unit test level 的integrate test)也是件麻煩事,
但當被test infect,又不能不test first。下次試試dbunit好了。

呀!tdd真是條不歸路呀 @@~

 
At 4:31 下午, Anonymous 匿名 said...

mock object太易脆了,只要小改一個地方,就會出現red bar.

而且easy mock用起來太囉唆了,在real class 裡用到的method都要原封不動的mock一次,有時覺得好像同樣的程式結構寫了兩次(test code,src code),bad smell,而且寫出來的test code又臭又長(看一下spring的src code就知道了>___<).

不過,jmock之流的更難用:

mockSubscriber.expects(once()).method("receive").with( eq(message) );

易脆的一踏糊塗,根本是跟refactory過不去嘛(雖然jmock的creator一直強調用jmock寫出來的test不應該是易脆的.....>__<)

但測實際資料(unit test level 的integrate test)也是件麻煩事,
但當被test infect,又不能不test first。下次試試dbunit好了。

呀!tdd真是條不歸路呀 @@~

 
At 4:48 下午, Blogger ingramchen said...

EazyMock 用起來的確會有這樣的現象,就是同樣的程式結構寫了兩次。不過比起 database 的 unit test 真的是好太多了。
我們專案裡 EasyMock 多用在 DAO 上。當寫到會用到 DAO 時的測試就變的很簡單!通通不用碰資料庫!如果發現 Test 裡的 depend 太多 mock,太複雜,那就表示有 bad smell,要做 refactoring 了。

可以做 mock 的物件通常是 dao / service 之類的,而這類物件修改的時候盡量用 refactoring 來做,避免影響太大。domain entity 原則上是不做 mock 的。

 

張貼留言

<< Home