jmock издевается над статическим методом - PullRequest
11 голосов
/ 20 октября 2008

В моем коде есть статический метод, который я хотел бы как-то смутить.

Я использую jmock.

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

Я поступаю неправильно?

FEEDBACK:

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

Ответы [ 3 ]

8 голосов
/ 21 мая 2009

Мы не поддерживаем насмешливые статические методы в jMock, потому что они не соответствуют нашему подходу к дизайну. Мы предпочитаем не использовать статические методы для важных функций, которые могут повлиять на состояние системы. Мы склонны использовать их просто для поддержки ОО-кода и сделать его более читабельным. Вот почему мы рассматриваем использование статических методов как намек на проблему. Единственным исключением является случай, когда он находится в сторонней библиотеке, но в любом случае мы бы, вероятно, обернули это в нечто более объектно-ориентированное.

5 голосов
/ 27 июня 2009

JMockit - это еще один инструментарий, который позволяет использовать статические методы (а также конечные методы, конструкторы и т. Д.).

Я не вижу никаких проблем с разумным использованием статических методов при разработке другого решения ОО.

Например, один шаблон / идиома, которую мне нравится использовать, - это статический фасад , в частности, для обеспечения более простого и легкого в использовании API для подсистемы постоянства в бизнес-приложении. На мой взгляд, ни одно другое решение не является более элегантным, чем что-то вроде:


    List<Person> peopleAboveAge = 
        find("select p from Person p where p.age >= ?", age);

, где метод find статически импортируется из класса PersistenceFacade, который определяет только статические методы и инкапсулирует способ получения надлежащего экземпляра Session / EntityManager. Это решение подходит для модульного тестирования и является гибким. Я использовал его в бизнес-приложении, в котором было более 500 постоянных объектов, использующих Hibernate. Статический фасад помог, когда мы мигрировали из Hibernate 2 в Hibernate 3, когда мы мигрировали из Oracle в Sybase и затем обратно в Oracle, и когда мы начали использовать аннотации JPA вместо файлов "hbm.xml" для отображения ORM.

2 голосов
/ 04 ноября 2008

Powermock является расширением EasyMock, которое позволяет высмеивать статические методы.

...