Java: разрешить конфликт пространства имен

#java

#java

Вопрос:

У нас есть jar, для которого мы потеряли исходный код. Я декомпилировал jar и создал из него новый исходный код. Затем я хочу убедиться, что исходный код и старый jar имеют одинаковое поведение. Я пишу модульные тесты для проверки, проблема в том, что они оба имеют одинаковое пространство имен / имя класса, поэтому я не знаю, как устранить неоднозначность старого jar и нового исходного кода. Что я могу сделать или это невозможно?

Ответ №1:

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

Комментарии:

1. Я надеялся, что мне не придется этого делать, но, похоже, это единственный вариант.

Ответ №2:

Предоставьте новому источнику временное пространство имен для целей тестирования. Тогда вместо импорта вы можете ссылаться на свои новые классы как:

 com.yourfirm.test.packagename.TheClassName
  

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

Или просто запустите тесты с помощью -cp oldpackage.jar а затем -cp newpackage.jar .

Комментарии:

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

Ответ №3:

Это возможно, но вам придется повозиться с загрузкой класса. Вместо того, чтобы помещать любой из jar-файлов в classpath, вам нужно будет загрузить их во время выполнения. Проверьте, есть ли в JCL библиотека, которая позволит вам это сделать. (Отказ от ответственности: я никогда не использовал JCL.)

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

Ответ №4:

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

Ответ №5:

Похоже, вы пытаетесь выполнить тесты для обоих jar одновременно. Я не знаю способа устранить неоднозначность старых / новых jar, если они оба находятся в пути к классу.

Если ваши модульные тесты выводят результаты в стандартный вывод / stderr, вы можете запустить тесты в исходном jar и сохранить результаты. Затем запустите тесты с новым jar и сохраните результаты в отдельном файле. Затем измените файлы.

Другим подходом было бы провести рефакторинг нового исходного кода, чтобы он имел уникальное пространство имен. Затем вы могли бы протестировать оба jar-файла одновременно, но может потребоваться много работы, чтобы заставить существующие программы использовать новый jar.

Ответ №6:

Если вы запускаете свои тесты через ant (Junit-task), вы можете управлять ant classpath отдельно для обоих запусков (один раз через jar, один раз через набор файлов классов).