Groovy макет Java-класс с параметрами - PullRequest
4 голосов
/ 09 февраля 2010

Я пытаюсь использовать Groovy MockFor и proxyDelegateInstance для макета java-класса с параметрами конструктора, но я не могу понять, что это правильно. Мой класс Java выглядит так:

class MyJavaClass {
   private MyObject myObj
   public MyJavaClass(MyObject myObj) {
      this.myObj = myObj;
   }
}

class MyGroovyTest {
    @Test
    void testMyJavaClass() {
        def mock = new MockFor(MyJavaClass)
        MyJavaClass mjc = new MyJavaClass()
        def mockProxy = mock.proxyDelegateInstance([mjc] as Object[])
        // if I pass mockProxy to anything, I get an error that a matching 
        // constructor could not be found. I've tried variations on the args 
        // to proxyDelegateInstance (such as using mjc as a single arg rather than 
        // an array of one element)
    }

}

Могу ли я сделать это на самом деле? И если да, то как я могу это сделать?

спасибо, Джефф

Ответы [ 2 ]

5 голосов
/ 12 февраля 2010

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

4 голосов
/ 09 февраля 2010

Я не могу сказать вам, почему ваш код выше не работает, но в Groovy есть несколько способов насмехаться над классами Java без использования MockFor. Например, если вы хотите перехватить все вызовы объекта, вы можете реализовать invokeMethod в метаклассе классов, например,

class SomeJavaClass {
  // methods not shown
}

def instance = new SomeJavaClass()

instance.metaClass.invokeMethod = {String name, args ->
  // this will be called for all methods invoked on instance
}

В качестве альтернативы, если вы просто хотите предоставить объект, который поддерживает сигнатуры методов SomeJavaClass, вы можете использовать Map или Expando со свойствами, где:

  • имена свойств соответствуют именам методов
  • значения свойства - это замыкания, которые принимают те же параметры, что и методы

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

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