Может ли gmock издеваться над статическими методами классов Java? Альтернатива?

Я не мог заставить его работать. Вроде метод не издевается.

Существуют ли альтернативные фреймворки для тестирования Groovy, которые лучше работают для имитации статических методов Java?

Обновление от 02 марта 2011 г.: добавлен код:

На самом деле я пытаюсь издеваться над классом Scala XML.loadXml (я пробую Groovy для модульного тестирования):

Это мой тестовый пример:

// ContentManagementGatewayTest.groovy
class ContentManagementGatewayTest extends GMockTestCase
{
  void testGetFileList()
  { 
      // Preparing mocks code will go here, see below

      play {
           GetFileGateway gateway = new GetFileGateway();
           gateway.getData();
      }
  }
}

// GetFileGateway.scala
class GetFileGateway {
    def getData() 
    {  
         // ...
         val xmlData = XML.loadData("file1.txt");
    }
}

Я пробовал тестировать, используя как gmock, так и метакласс:

// metaClass:
XML.metaClass.'static'.loadFile = {file ->
      return "test"
}

// gmock:
def xmlMock = mock(XML)
xmlMock.static.loadFile().returns(stream.getText())

person mbdev    schedule 02.03.2011    source источник


Ответы (3)


В Scala нет статических методов, поэтому неудивительно, что вы не можете смоделировать один из них — его не существует.

Метод loadXml, на который вы ссылаетесь, находится в XML объекте. Вы можете получить этот объект из Java с помощью scala.XML$.MODULE$, но, поскольку объекты являются одноэлементными, его класс является окончательным.

Увы, loadXML определяется в классе XMLLoader, который расширяет объект XML, а не в самом объекте XML. Таким образом, вы можете просто сделать обычный макет XMLLoader. В нем будет отсутствовать несколько методов, но, возможно, он сделает все, что вам нужно.

person Daniel C. Sobral    schedule 02.03.2011

Вы можете сделать это с помощью Groovy (метапрограммирование), вам не нужны никакие дополнительные библиотеки. Вот (глупый) пример, который переопределяет Collections.max так, что он всегда возвращает 42. Запустите этот код в консоли Groovy, чтобы протестировать его.

// Replace the max method with one that always returns 42
Collections.metaClass.static.max = {Collection coll ->
  return 42
}  

// Test it out, if the replacement has been successful, the assertion will pass
def list = [1, 2, 3]
assert 42 == Collections.max(list)

Обновлять

Вы упомянули в комментарии, что мое предложение не сработало. Вот еще один пример, соответствующий коду, который вы указали в своем вопросе. Я протестировал его в консоли Groovy, и он у меня работает. Если у вас не работает, расскажите, чем ваше тестирование отличается от моего.

Math.metaClass.static.random = {-> 0.5}
assert 0.5 == Math.random()
person Dónal    schedule 02.03.2011
comment
Оказывается, это результат того, что XML является объектом в Scala. и не связано с возможностью gmock имитировать статику. - person mbdev; 02.03.2011

документация для GMock показывает, что вы можете просто сделать:

Имитация вызова статического метода и вызова свойства аналогична вызову стандартного метода, просто добавьте ключевое слово static:

def mockMath = mock(Math)
mockMath.static.random().returns(0.5)

play {
  assertEquals 0.5, Math.random()
}
person tim_yates    schedule 02.03.2011
comment
Ну, я думаю, что это работает с имитацией статических методов внутри groovy. См. здесь: hamletdarcy.blogspot.com/2008/04. / - person mbdev; 02.03.2011