Можно ли расширить класс без конструкторов в Java? - PullRequest
8 голосов
/ 17 июня 2009

В целях модульного тестирования я пытаюсь написать макет объекта класса без конструкторов.

Возможно ли это даже в Java, или класс просто не расширяется?

Ответы [ 7 ]

18 голосов
/ 17 июня 2009

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

Если класс имеет только частные конструкторы, то нет, он не может.

3 голосов
/ 17 июня 2009

Да, вы можете смоделировать объект, хотя, возможно, не удастся создать его подкласс (в любом случае, конечно, не слишком тесно связавшись с загрузчиком классов). Здесь , как вы делаете это с JMock.

Насмешка таким способом позволяет вам сохранить тип, не разбивая его на подклассы, хотя, вероятно, будет довольно трудно или невозможно выявить только определенное поведение. Так что этот метод подходит для тестирования классов, использующих этот класс, а не для тестирования самого класса.

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

Существуют также динамические языки, которые позволят вам выполнять подклассы и реализовывать интерфейс Java, с которым может взаимодействовать код Java, но я не очень знаком с деталями.

3 голосов
/ 17 июня 2009

На вопрос уже дан ответ, но для добавления комментария. Часто это подходящее время, чтобы предложить, чтобы код был написан для некоторой проверки.

Не расстраивайтесь, изучите, что нужно (по крайней мере, инъекцию зависимостей), узнайте, как писать макеты, и предложите разумный набор рекомендаций, которые позволят классам быть более полезными.

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

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

2 голосов
/ 17 июня 2009

Вы можете изменить модификаторы видимости с помощью отражения. Вот статья о том, как .

2 голосов
/ 17 июня 2009

Если у Java-класса нет определенных конструкторов, то для вас это не проблема. Проблемы будут в том случае, если в классе будут определены конструкторы, и все они будут невидимы для вас (приватно).

1 голос
/ 24 июня 2009

Вы можете смоделировать класс и любой или все его конструкторы, используя JMockit .

Это инструментарий для издевательства над Java, который позволяет вам издеваться над чем угодно. Даже если класс не является общедоступным и / или вложенным, он все равно может быть подделан. В JMockit есть несколько механизмов, которые можно использовать для этого. Дистрибутив инструментария также содержит множество примеров тестов JUnit.

Если класс реализует некоторый интерфейс или расширяет абстрактный класс, вы можете указать JMockit «захватывать» и имитировать реализации базового типа по требованию, так как они загружаются JVM и даже назначают созданные экземпляры полю в тестовом классе.

0 голосов
/ 17 июня 2009

Если есть только частные конструкторы, вы все равно можете использовать отражение, чтобы иметь доступ к ним извне этого класса.

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