Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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のことわかってないや。
うくく。