Может ли gmock высмеивать статические методы классов Java? Альтернатива? - PullRequest
0 голосов
/ 02 марта 2011

Я не мог заставить его работать.Это похоже на то, что метод не проверяется.

Существуют ли альтернативные базовые среды тестирования, которые лучше работают для моделирования статических методов 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:

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

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

Ответы [ 3 ]

3 голосов
/ 02 марта 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()
2 голосов
/ 02 марта 2011

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

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

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

2 голосов
/ 02 марта 2011

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

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

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

play {
  assertEquals 0.5, Math.random()
}
...