Допустим, я инструментирую класс, в котором хочу добавить пару инструкций к некоторым частям метода. Например, давайте рассмотрим случай, когда я хочу разработать посетителя V
для переименования инструкций вызова метода, существующих в методе C.m()
, с C.n()
на C.n_detour()
.
Какой самый простой способ проверить, что после выполнения V
поверх C
можно действительно получить желаемые результаты? Здесь я говорю о тестировании в стиле xUnit.
Сначала я думал, что могу запустить TraceMethodVisitor
поверх C
и сравнить его со своей собственной строкой, но оказалось, что есть много «декоративных» инструкций (таких как нумерация строк и т. д.), которые в значительной степени не имеют отношения к моим тестам. (см. Форматирование вывода TraceClassVisitor).
Теоретически я знаю, что могу создать посетителя, который будет запускать и проверять как наличие C.n_detour()
, так и отсутствие C.n()
, но я бы предпочел использовать что-то более похожее на описанный выше подход (сравнение инструкции с инструкцией).
Я взглянул на ASM Tree API, но он выглядит не намного лучше, так как там тоже появляются эти decoration
инструкции.
Есть ли у кого-нибудь опыт тестирования кода в прошлом с использованием ASM?