Позднее добавление к теме, обмен информацией о новых решениях
Я также ищу правильный и эффективный способ проверки (на основе JUnit) правильности нескольких реализаций некоторых интерфейсов и абстрактных классов. К сожалению, ни тесты JUnit @Parameterized
, ни эквивалентная концепция TestNG не соответствуют моим требованиям, поскольку я не знаю a priori списка реализаций этих интерфейсных / абстрактных классов, которые могут существовать. То есть могут быть разработаны новые реализации, и тестеры могут не иметь доступа ко всем существующим реализациям; поэтому неэффективно, чтобы тестовые классы определяли список классов реализации.
На данный момент я обнаружил следующий проект, который, кажется, предлагает полное и эффективное решение для упрощения этого типа тестов: https://github.com/Claudenw/junit-contracts. Это в основном позволяет определить «Контрактные тесты» через аннотацию @Contract(InterfaceClass.class)
для контрактных тестовых классов. Затем разработчик создаст тестовый класс для конкретной реализации с аннотациями @RunWith(ContractSuite.class)
и @ContractImpl(value = ImplementationClass.class)
; движок должен автоматически применять любой контрактный тест, который применяется к ExecutionClass, отыскивая весь Контрактный тест, определенный для любого интерфейса или абстрактного класса, из которого происходит урочный реализация. Я еще не тестировал это решение, но это звучит многообещающе.
Я также нашел следующую библиотеку: http://www.jqno.nl/equalsverifier/. Это удовлетворяет аналогичную, хотя и более конкретную потребность, которая заключается в утверждении соответствия класса конкретно контрактам Object.equals и Object.hashcode.
Аналогичным образом, https://bitbucket.org/chas678/testhelpers/src демонстрируют стратегию проверки некоторых Java-контрактов, включая Object.equals, Object.hashcode, Comparable.compare, Serializable. В этом проекте используются простые тестовые структуры, которые, я считаю, могут быть легко воспроизведены для удовлетворения любых конкретных потребностей.
Ну, вот и все; Я буду держать этот пост обновленным с другой полезной информацией, которую я могу найти.