Просто несколько начальных мыслей по этому вопросу (которые могут объяснить, почему до сих пор нет ответа через час !?;)
Кажется, что есть две части, когда речь идет о реализации решения вопроса:
1 / восстановить все мои собственные классы. Легко, вы даете имя jar, метод инициализации теста Junit будет:
- проверить, находится ли этот jar в пути к классам выполнения JUnit
- читать и загружать все классы в нем
- запоминает только те, для которых equals () и hash () были объявлены и переопределены (через Reflection)
2 / проверка каждого объекта
... и здесь кроется подвох: вам нужно создать экземпляр этих объектов, то есть создать два экземпляра, и использовать их для тестов equals ().
Это означает, что если ваши конструкторы принимают аргументы, вы должны учитывать,
- для аргументов примитивных типов (int, boolean, float, ...) или String, любые комбинации предельных значений (для String, "xxx", "", null; fonr int, 0, -x, + x , -Integer.MIN, + Integer.MAX, ... и т. Д.)
- для не примитивных типов создайте экземпляр тех, которые будут переданы в конструктор объекта для тестирования (это означает, что вы должны рекурсивно учитывать параметры конструктора этого параметра: примитивные типы или нет)
Наконец, не все параметры, автоматически создаваемые для этого конструктора, будут иметь функциональный смысл, то есть некоторые из этих значений не смогут создать экземпляр из-за утверждения: это должно быть обнаружено.
Тем не менее, это кажется возможным (вы можете сделать это вызовом кода , если хотите), но сначала я хочу, чтобы другие читатели StackOverflow ответили на эту проблему, так как они может увидеть гораздо более простое решение, чем я.
Чтобы избежать проблемы с комбинациями и сохранить тест релевантный тестирование значений, близких к самому фактическому коду, я бы порекомендовал определить выделенную аннотацию, где строка представляет действительные значения конструкторы. Он будет расположен прямо над переопределенным методом equals () одного из ваших объектов.
Затем эти значения аннотации будут считаны, а созданные из них экземпляры будут объединены для проверки equals (). Это уменьшит количество комбинаций
Side-node: универсальный тестовый пример JUnit, конечно, проверит, что для каждого equals () для тестов есть:
- некоторые аннотации, как описано выше (если не доступен только конструктор по умолчанию)
- соответствующий метод hash () также переопределяется (если нет, если выдается исключение assert и происходит сбой в этом классе)