EasyMockをまねて、汎用モックを作ってみた。
汎用モックに実装されるFooインターフェースは以下の通り。
package foo.bar;public interface Foo {
public String func1();
public String func2();
}
汎用モックは以下の通り。
package foo.bar;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;public class Mock {
private Class clazz = null;
private MockUtilsInvocationHandler handler = new MockUtilsInvocationHandler();
public Mock(Class clazz) {
this.clazz = clazz;
}public Object getMock() {
return Proxy.newProxyInstance(clazz.getClassLoader(),
new Class { clazz }, handler);
}public void add(String method, Object ret) {
handler.add(method, ret);
}}
class MockUtilsInvocationHandler implements InvocationHandler {
private Map returns = new HashMap();
public Object invoke(Object proxy, Method method, Object args)
throws Throwable {
return returns.get(method.getName());
}public void add(String method, Object ret) {
returns.put(method, ret);
}}
で、実行クラス。
package foo.bar;public class Runner {
public static void main(String[] args) {
Mock mock = new Mock(Foo.class);
mock.add("func1", "func1() called.");
mock.add("func2", "func2() called.");Foo foo = (Foo) mock.getMock();
System.out.println(foo.func1());
System.out.println(foo.func2());
}}
実行結果は以下の通り。
func1() called.
func2() called.