Используйте Javassist в тесте JUnit - PullRequest
0 голосов
/ 10 декабря 2011

У меня довольно слабое понимание JUnit и Javassist, я просто хочу использовать их для анализа программ. Например, учитывая библиотеку, я хочу знать во время выполнения, какие методы в библиотеке были вызваны. Я могу использовать манипулирование байт-кодом для вставки system.out.println ("имя_метода"); утверждение в начале метода. Поэтому во время выполнения он выведет, какие методы были вызваны.

В автономном приложении я могу перехватить до вызова main () и использовать свой собственный загрузчик классов (см. Ниже), однако в JUnit нет main (), может кто-нибудь показать мне, как перехватить в этой ситуации? Большое спасибо.

...
  Loader loader = new Loader( pool );
  loader.addTranslator( pool, xlat );
  loader.run( className, args );
...

Редактировать: я использую JUnit 4.8 и Javassist 3.15.0.GA

1 Ответ

0 голосов
/ 10 декабря 2011

Могу ли я порекомендовать альтернативный подход? Вместо этого вы можете использовать аспектно-ориентированный подход, используя AspectJ . При этом вы можете определить точечные вызовы вокруг подмножества или всех методов, которые вы хотите отслеживать.

Другой вариант: если вы хотите отслеживать покрытие кода (тот факт, что вы используете JUnit и просто хотите сделать System.out.println(...) - это хороший намек на это), возможно, вы ищете инструмент покрытия кода ? Если это так, Cobertura будет вашим лучшим выбором - не требуется никакого специального кодирования.

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

Если вы используете Eclipse в качестве своей IDE, оба эти соединения очень хорошо подходят для Eclipse. AspectJ на самом деле является проектом Eclipse, но не требует Eclipse. Подключаемый модуль Eclipse для Cobertura: eCobertura .

Еще один вариант для этого - сделать это внутри самого JUnit - и это не потребует манипулирования байт-кодом. Взгляните на его TestWatchman класс. У меня пока нет этого документированного онлайн, как и с другими моими библиотеками, но вы можете взглянуть на мой класс BaseTest как часть моей библиотеки утилит JUnit . Любой тестовый класс JUnit, который расширяет это, будет автоматически регистрироваться (в SLF4J), когда каждый тест начинается, успешно или неудачно. Тем не менее, это все только на уровне тестирования и не поможет контролировать другие методы, которые запускает каждый тест.

...