TestCaseその9 Mockについて
もっくんことMockについての考察。
私はMock系をそんなに触っていないのでたいして詳しくないんだが。
基本的にjavascriptなんでprototypeからproperty検索を行うはず。
そこで存在しないObjectをprototypeで返すというパターンはどうだろうか?
返すObjectは何をテストするかによって変わるのでいじれるようする。
で土台はこんな感じで。
どうなんでしょうか?
MockObject
アホでも書けるコードです。
package org.seasar.teeda.extension.spike.rhino; import java.util.Map; import java.util.Set; import org.mozilla.javascript.NativeObject; import org.mozilla.javascript.Scriptable; public class MockObject extends NativeObject { private Map map; public MockObject(Map map) { this.map = map; } public boolean has(String name, Scriptable scriptable) { if (map.containsKey(name)) { return true; } return super.has(name, scriptable); } public Object get(String name, Scriptable scriptable) { if (map.containsKey(name)) { return map.get(name); } return super.get(name, scriptable); } public Object[] getIds() { int size = map.size(); Object[] id = super.getIds(); Object[] ret = new Object[size + id.length]; Set set = map.keySet(); Object[] list = set.toArray(new String[set.size()]); for (int i = 0; i < id.length; i++) { ret[i] = id[i]; } for (int i = 0; i < list.length; i++) { ret[i + list.length] = list[i]; } return ret; } public String getClassName() { return "MockObject"; } }
まあ普通。
呼び出し
Map map = new HashMap(); map.put("mock", "Test"); scope.setPrototype(new MockObject(map));
"mock"に対してStringクラスが返るように仕向けてます。
でprototypeにセットします。
Test.js
function testFunction2(){ java.lang.System.out.println(mock.toString()); }
mockはどこにもいないんだけど呼び出せます。
(当たり前)
実際には多分FunctionObjectあたりを返る様に仕向けておけばいいかなと。
(id:winebarrelさん方式でいいかなと。詳しくはこちらかな2006-05-31 - lambda {|diary| lambda { diary.succ! } }.call(hatena))
一応言っておくとこれはscopeにprototypeが存在しない場合に有効なわけです。
既にprototypeが存在した場合はちょと工夫がいります。
(まあほんのちょっとだけど)
んーやっぱMockのことわかってないや。
うくく。