Вы можете обернуть RealObjectUnderTest
CompiledMethod
напрямую, используя библиотеку ObjectsAsMethodsWrapper. Это обеспечивает удобный API для установки и удаления оболочек вместе с некоторыми удобными предопределенными оболочками.
Они будут перехватывать самоотправку, потому что оболочки устанавливаются в словаре методов реального объекта и, таким образом, могут выполнять произвольные изменения в сообщении перед передачей его базовому CompiledMethod
.
Хотя мой пример показывает, как запомнить метод call, не касаясь исходного кода, он должен предоставить вам базовые знания, необходимые для имитации вызовов методов.
Этот конкретный метод имеет ограничение: он перехватывает самоотправку сообщений, которые определяет сам класс. Таким образом, если Foo
является подклассом Bar
и вы устанавливаете обертки на Foo
, вы не будете перехватывать сообщения, являющиеся частью протокола Bar
(если, конечно, вы не обернете и их).
Вы не сможете перехватить ifTrue:ifFalse:
, timesRepeat
или подобные сообщения в образах Squeak или Pharo (и, вероятно, также в GNU Smalltalk), потому что это не отправка сообщений: преобразования во время компиляции встраивают эти сообщения отправляет в байт-коды перехода. (Иллюзия отправки сообщения относительно убедительна, потому что Decompiler
знает, как отменить преобразование байт-кодов обратно в ifTrue:ifFalse:
или что-то еще.)
person
Frank Shearar
schedule
01.11.2012