Skip to Content
1
Jan 09, 2023 at 11:47 AM

ABAP Unit Tests for events

222 Views

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:

image.png

any ideas?

Thanks
~Enno

Attachments

image.png (8.4 kB)