Автоматическая заглушка в Java-слове. Что использовать? - PullRequest
1 голос
/ 27 мая 2009

У меня огромный класс, для которого мне нужно построить заглушку.

Чтобы дать вам картину, это класс сообщений GWT. Часто это класс с десятками методов, которые возвращают String.

С JMock я могу делать заглушки, но я закончу с разрешением каждого метода ... Это не то, что я хотел бы увидеть.

Есть ли что-то, что будет автоматически создавать заглушки для каждого метода? Мне нужны эти методы, чтобы вернуть что-то предопределенное, например пустую строку, но я буду рад любым предложениям.

Ответы [ 4 ]

1 голос
/ 28 мая 2009

Рад видеть, что вы нашли ответ. Просто для получения дополнительной информации, jMock позволяет довольно гибкие спецификации соответствия методов, см. http://www.jmock.org/match-object-or-method.html. Например, вы можете делать такие вещи:

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

для соответствия любому получателю.

S

1 голос
/ 28 мая 2009

В JMock вы можете разрешить методы, о которых вы заботитесь, с явными результатами, а затем разрешить любой другой метод объекта messages с разрешающим оператором, который не включает метод. E.g.:

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

Но ...

Если вы просто заглушаете кучу методов-получателей, фреймворк фиктивных объектов - неподходящий инструмент для использования. Поддельные объекты используются для проверки того, что тестируемый объект отправляет правильные команды соседним объектам для изменения среды.

Зачастую проще создать класс-заглушку, если интерфейс содержит только геттеры. Или вы можете использовать Узурпатор для автоматического создания заглушек.

1 голос
/ 28 мая 2009

Для интерфейса вы можете использовать функциональность 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 управляет заглушкой, в то время как все остальное просто водопровод.

0 голосов
/ 27 мая 2009

Если вы используете EasyMock , вам нужно только указать поведение / ожидания / заглушки для методов, которые вы на самом деле ожидаете вызывать и использовать.

После использования JMock и EasyMock, я должен сказать, что API EasyMock примерно в 10 раз проще в использовании, и поскольку интерфейс в основном статически типизирован, он также безопасен при рефакторинге (вы используете Strings для имен методов и т. Д.). ).

...