题
我有巨大的类,我需要建立存根。
为了让你想象它是Messages类的GWT的。通常,这是用许多方法返回String的类。
使用JMock的我能做的磕碰,但我会允许每个方法结束......这不是我想看到的。
有什么,它会自动建立每种方法的存根?我需要这个方法返回预定义的东西,比如空字符串,但我会很乐意与任何建议。
解决方案
在JMock的可以允许你所关心的具有明确的结果的方法和然后允许的消息的任何其他方法与不包含的方法的允许语句对象。 E.g:
allowing(m).getBlah("something");
will(returnValue("foo"));
allowing(m); // matches anything else, will return some default value if called
但是...
如果你只是磕碰一堆的getter方法,一个模拟对象的框架是用错误的工具。模拟对象用于测试被测对象发送正确的命令,以相邻的对象在其环境中,以实现改变。
这往往更容易地创建一个存根类,如果只包含干将的接口。或者你可以使用篡位来自动生成存根。
其他提示
有关的接口可以使用java.lang.reflect.Proxy的功能。假设你要存根MessageConstants类中进行解答,代码将类似于:
InvocationHandler handler = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (String.class.equals(method.getReturnType()))
return "proxy generated method return";
throw new AbstractMethodError("Not implemented");
}
};
Class<?> proxyClass = Proxy.getProxyClass(MessageConstants.class.getClassLoader(), new Class[] { MessageConstants.class });
MessageConstants messageConstants = (MessageConstants) proxyClass.getConstructor(new Class[] {InvocationHandler.class}).newInstance(new Object[] { handler });
System.out.println(messageConstants.description());
messageConstants.getBoolean("someBoolean");
和将导致
proxy generated method return
Exception in thread "main" java.lang.Error: Not implemented
at xxx.Application$1.invoke(Application.java:48)
at $Proxy0.getBoolean(Unknown Source)
at xxx.Application.main(Application.java:64)
在的InvocationHandler驱动存根,而剩下的只是管道。
很高兴见到你找到答案。只是为了进一步信息,JMock的允许你怎么搭配方法十分灵活的规格,请参见 HTTP ://www.jmock.org/match-object-or-method.html 。例如,你可以做这样的事情:
allowing (any(Object.class)).method("get.*").withNoArguments();
,以匹配任何吸气剂。
取值
如果您使用 EasyMock的,你只需要为你真正希望的方式指定行为/期望/存根被调用和使用。
同时使用JMock的和EasyMock的之后,我不得不说,EasyMock的的API是大约10倍更容易使用,并且由于界面主要是静态类型,它的重构安全,以及(您使用字符串方法名称等)。
不隶属于 StackOverflow