Создание фиктивного объекта без фреймворка - PullRequest
0 голосов
/ 14 марта 2012

В настоящее время я использую EasyMock и создаю подобные объекты

mockedObject = createMock(myInterface.class);

Простое моделирование - это ненужные накладные расходы (потому что метод, который я использую, действительно прост), и я хотел бы создать макет без него..

Но проблема в том, что myInterface - это интерфейс, так как мне его создать. Пожалуйста, предложите.

Спасибо, Шрирам

Ответы [ 5 ]

3 голосов
/ 15 марта 2012

Самый простой способ - создать внутренний класс, который реализует интерфейс, реализовать методы для возврата нужных данных, а затем использовать их в тестовом примере.

Например:

public void testMethod ( )
{
    MyInterface mockObject = new MyInterface ( ) {
        public void myMethod ( )
        {
            // NOOP
        }

        public int myFunction ( )
        {
            return -1 ;
        }
    }

    // Proceed with the test case using mockObject
}
1 голос
/ 15 марта 2012

В отсутствие фиктивного фреймворка java.lang.reflect.Proxy - ваш лучший выбор. Если вы никогда не использовали его ранее, вы можете создать динамический объект, который реализует набор интерфейсов, и вы используете InvocationHandler, чтобы проверить каждый вызов метода и решить, что делать. Это очень мощный метод (не ограничивающийся тестированием), поскольку вы можете делегировать вызовы методов другим объектам и т. Д. Он также изолирует вас от определенных изменений интерфейса, когда вы выполняете такое делегирование, поскольку объявить каждый метод. Он адаптируется к интерфейсу на рунтине.

public static interface MyIntf {
  String foo(String arg1);
}

InvocationHandler invocationHandler = new InvocationHandler() {
   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       if (method.getName().equals("foo") && 
           method.getParameterTypes().length == 1 &&
           method.getParameterTypes()[0] == String.class) {
           // do your mocking here.  For now i'll just return the input
           return args[0];
       }
       else {
           return null;
       }
   }
};

MyIntf myintf = (MyIntf) Proxy.newProxyInstance(getClass().getClassLoader(),
            new Class[] { MyIntf.class },
            invocationHandler);

System.out.println(myintf.foo("abc"));
0 голосов
/ 15 марта 2012

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

например

public void testMethod ( )
{
    MyInterface mockObject = new MyInterface ( ) {
       public int MyMethodCount = 0;
       public int MyFunctionCount = 0;

        public void myMethod ( )
        {
            MyMethodCount++;
            // NOOP
        }

        public int myFunction ( )
        {
            MyFunctionCount++;
            return -1 ;
        }
    }

    // Proceed with the test case using mockObject
}
0 голосов
/ 15 марта 2012

Вы можете создать и Anoymous класс, например.

   MyInterface myMock = new MyInterface() {
                               ... methods implemented here
                            };
0 голосов
/ 15 марта 2012

Вы не можете создать экземпляр интерфейса, вам нужно работать с одной из его реализаций. Поскольку вы решили отказаться от EasyMock (не уверен почему), вам нужно либо создать экземпляр одной из существующих реализаций интерфейсов, либо создать новую только для тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...