Тестирование всех классов, которые реализуют интерфейс в Java - PullRequest
7 голосов
/ 20 сентября 2008

Есть ли что-нибудь (в частности, для Java), которое позволяет автоматически проверять поведение интерфейса? В качестве примера, скажем, у меня есть несколько тестов для интерфейса Comparable, которые должны применяться ко всему, что реализует Comparable. Я хотел бы иметь возможность автоматически включать «ComparableTests» в тестовые приборы для любого из моих классов, которые реализуют Comparable. Бонусные баллы, если это будет работать с универсальными интерфейсами.

Я знаю, что .NET Framework mbUnit имеет что-то похожее, и когда вы используете что-то вроде функций генератора TestNG, вы можете настроить тестовое устройство для Comparable и заставить генератор создавать экземпляр каждого ваши классы, которые реализуют Comparable. Но я бы предпочел, чтобы он был автоматическим и располагался на тестовом приборе для каждого из моих классов (поскольку у меня уже есть его для тестирования других частей этого класса).

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

Ответы [ 4 ]

1 голос
/ 15 июля 2009
1 голос
/ 21 сентября 2008

Исходя из вашего последнего абзаца, вы пытаетесь внедрить некоторые «дополнительные методы» в модульное тестирование, поскольку вы уже тестируете определенный класс. Я не знаю ни одного жгута для тестирования, который бы позволял вам прикреплять тесты на основе иерархии классов.

Однако, с вашим собственным предложением использовать TestNG для создания чего-то подобного, я думаю, вы могли бы быть очень близки. Вы могли бы очень хорошо включить некоторый базовый код, который добавляет ваш класс в список «тестовых классов по умолчанию», которые, в свою очередь, тестируются, если они реализуют определенный интерфейс.

Тем не менее, что касается общего случая, я думаю, что вам не повезло, поскольку система типов Java односторонняя, вы можете только (легко) узнать, какие интерфейсы реализует класс, а не наоборот. Кроме того, проблема заключается в том, «где перестать искать»: если у вас есть тест, который проверяет все ваши comparable реализаторы, хотите ли вы, чтобы он также проверял достоверность одного из String, поскольку он есть в вашей среде Java

0 голосов
/ 21 сентября 2008

Одним из способов будет поиск в файле jar всех файлов .class (или поиск в каталоге классов), использование метода Class.forName () для загрузки файла класса и проверка MyInterface.class.isAssignableFrom (myClass ).

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

0 голосов
/ 20 сентября 2008

В .NET было бы довольно просто настроить метод, который просматривает сборку и идентифицирует иерархию наследования / реализации каждого класса. Я уверен, что вы можете сделать это и на Java, если исследуете API отражения Java .

Затем можно создать массив ITargetInterface s и вызвать метод тестирования для каждого из них.

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