java.lang.reflect.Proxyを使ってみる その3

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.