2009-06-17 3 views
8

Для тестирования модулей я пытаюсь написать mock object класса без конструкторов.Можно ли расширить класс без конструкторов в Java?

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

+2

Вопрос в том, можно ли его издеваться, а не подклассифицировать, учитывая принятый ответ, возможно, вы должны изменить вопрос, если это то, что вы имели в виду? – Yishai

+0

Мои вопросы четко задают вопрос о расширяемости. Он лишь упоминает насмешку как причину желания этой расширяемости. –

ответ

18

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

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

+0

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

+0

Похоже, этот класс не очень дружелюбен с точки зрения тестирования. Вы действительно должны использовать интерфейсы, а не типы concerete ... –

+1

Итак, вы тестируете синглтон? Это всегда оказывается болью в прикладе. –

2

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

0

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

+0

Но это не поможет вам расширить класс. Компилятор не позволит вам расширить класс только с частными конструкторами. – Eddie

3

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

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

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

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

+0

Класс, который я искал для издевательства, был классом Blackberry, который я не контролирую. –

+0

Вы делаете хороший момент (если один из насмехается над кодом, который они могут изменить), но это, вероятно, должно было быть введено как комментарий вместо ответа. – hotshot309

+0

Я согласен, но неспособность отделять текст от абзацев в комментариях часто оставляет меня в ярости, но в эти дни (три года спустя) я думаю, что я бы сделал это, чтобы жить и учиться. –

3

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

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

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

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

1

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

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

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

Смежные вопросы