1

我有大量的课程需要为其构建存根。

为了给你图片,它是 GWT 的 Messages 类。通常这是一个有几十个返回字符串的方法的类。

使用 JMock,我可以做 stubbing,但我会以允许每种方法结束……这不是我希望看到的。

有什么东西会自动为每种方法构建存根吗?我需要这个方法来返回一些预定义的东西,比如空字符串,但我会对任何建议感到满意。

4

4 回答 4

1

在 JMock 中,您可以使用显式结果允许您关心的方法,然后使用不包含方法的允许语句允许消息对象的任何其他方法。例如:

allowing(m).getBlah("something");
    will(returnValue("foo"));
allowing(m); // matches anything else, will return some default value if called 

但...

如果您只是存根一堆 getter 方法,那么使用模拟对象框架是错误的工具。模拟对象用于测试被测对象是否向相邻对象发送正确的命令以影响其环境的变化。

如果接口只包含 getter,那么创建存根类通常会更容易。或者您可以使用Usurper自动生成存根。

于 2009-05-27T21:19:26.677 回答
1

对于接口,您可以使用 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 驱动存根,而其余的只是管道。

于 2009-05-27T21:22:19.637 回答
1

很高兴看到你找到了答案。只是为了获得更多信息,jMock 允许非常灵活地指定如何匹配方法,请参阅http://www.jmock.org/match-object-or-method.html。例如,您可以执行以下操作:

allowing (any(Object.class)).method("get.*").withNoArguments();

匹配任何吸气剂。

小号

于 2009-05-28T13:42:29.270 回答
0

如果您使用EasyMock,您只需要为您实际希望被调用和使用的方法指定行为/期望/存根。

在同时使用了 JMock 和 EasyMock 之后,我不得不说 EasyMock 的 API 使用方便了大约 10 倍,而且由于接口大部分是静态类型的,所以它也可以安全地进行重构(您正在使用字符串作为方法名称等)。

于 2009-05-27T18:29:18.627 回答