Hello ABAPers!
Short question: How do I unit test events of an object?
Sample code: a global class that raises an event after some data was changed:
CLASS zcl_enno_001 DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
TYPES: BEGIN OF _dataline,
value TYPE string,
END OF _dataline,
_datatable TYPE SORTED TABLE OF _dataline WITH UNIQUE KEY value.
EVENTS something_changed.
METHODS add_data
IMPORTING
i_data TYPE clike.
METHODS get_data
RETURNING VALUE(r_data) TYPE _datatable.
PROTECTED SECTION.
PRIVATE SECTION.
DATA data TYPE _datatable.
ENDCLASS.
CLASS zcl_enno_001 IMPLEMENTATION.
METHOD add_data.
IF NOT line_exists( data[ value = i_data ] ).
INSERT VALUE #( value = i_data ) INTO TABLE data.
RAISE EVENT something_changed.
ENDIF.
ENDMETHOD.
METHOD get_data.
r_data = data.
ENDMETHOD.
ENDCLASS.
My (so far) unit test:
CLASS ltcl_event DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS on_something_changed
FOR EVENT something_changed OF zcl_enno_001
IMPORTING sender.
METHODS change_something FOR TESTING.
ENDCLASS.
CLASS ltcl_event IMPLEMENTATION.
METHOD change_something.
DATA(cut) = NEW zcl_enno_001( ).
cut->add_data( 'ABCD' ).
SET HANDLER on_something_changed FOR cut.
cl_abap_unit_assert=>assert_equals(
act = cut->get_data( )
exp = VALUE zcl_enno_001=>_datatable( ( value = `ABCD` ) ) ).
ENDMETHOD.
METHOD on_something_changed.
cl_abap_unit_assert=>assert_bound( sender ).
ENDMETHOD.
ENDCLASS.
Problem: the event handler method might be called, but I cannot prove with a unit test, because I cannot mark the handler method as FOR TESTING and therefore it will not be logged:

any ideas?
Thanks
~Enno