Jmock издевается над статическим методом

У меня есть статический метод в моем коде, который я бы хотел каким-то образом высмеять.

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

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

Я делаю это неправильно?

ОБРАТНЫЙ:

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

Ответ 1

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

Ответ 2

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

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

Например, один шаблон/идиома, который мне нравится использовать, - это статический фасад, в частности, для обеспечения более простого и простого в использовании 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.

Ответ 3

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