I try to write unit tests for as much of my code as I think makes sense. To speed up the creation of my unit tests, I’ve set up two ABAP templates in eclipse which I want to share with you in this post.

The local test helper class

I try to adhere to the recommendation of the SAP style guide for Clean ABAP of putting help methods in help classes. I typically create several local test classes for the same class under test to avoid making one huge local test class. These local test classes can then share the common help methods which I’ve put into the local test helper class. I typically make the help methods available to the local test classes through inheritance.

Some examples of when I create help methods are:

  • I want to do asserts for several attributes of a complex object.
  • I want to create a complex object. In the test methods, I then change the specific attribute which I’m interested in testing by using a set method.

My template for the local test helper class looks like this:

CLASS lth_unit_tests DEFINITION ABSTRACT.
  PROTECTED SECTION.
    METHODS assert_complex_entity
      IMPORTING
        act TYPE REF TO zcl_complex_entity
        exp TYPE REF TO zcl_complex_entity.
    METHODS create_mock_complex_entity
      RETURNING
        VALUE(result) TYPE REF TO zcl_complex_entity.
ENDCLASS.

CLASS lth_unit_tests IMPLEMENTATION.

  METHOD assert_complex_entity.
    cl_abap_unit_assert=>assert_equals( act = act->get_description( )
                                        exp = exp->get_description( ) ).
    cl_abap_unit_assert=>assert_equals( act = act->get_start_date( )
                                        exp = exp->get_start_date( ) ).
  ENDMETHOD.

  METHOD create_mock_complex_entity.
    result = zcl_complex_factory=>create_complex_entity(
        	   description = `My test description`
        	   start_date  = '20200330' ).
  ENDMETHOD.

ENDCLASS.

The local test class

In the local test classes, I put the actual tests. To be able to access the helper methods of the local test helper class, I let the local test classes inherit lth_unit_tests.

Depending on if I use the factory pattern, the setup method might call a factory to instantiate cut instead of directly using the NEW keyword. I rarely use class_setup, class_teardown or teardown so I often end up deleting these three methods from the local test classes.

CLASS ltc_unit_tests DEFINITION INHERITING FROM lth_unit_tests FINAL FOR TESTING
  DURATION SHORT
  RISK LEVEL HARMLESS.

  PRIVATE SECTION.
    DATA cut TYPE REF TO zif_my_interface.

    CLASS-METHODS:
      class_setup,
      class_teardown.

    METHODS:
      setup,
      teardown,
      first_test FOR TESTING.
ENDCLASS.

CLASS ltc_unit_tests IMPLEMENTATION.

  METHOD class_setup.

  ENDMETHOD.

  METHOD setup.
    cut = NEW zcl_my_class( ).
  ENDMETHOD.

  METHOD teardown.

  ENDMETHOD.

  METHOD class_teardown.

  ENDMETHOD.

  METHOD first_test.
    " given

    " when

    " then
    cl_abap_unit_assert=>fail( msg = 'Implement the first test here' ).
  ENDMETHOD.

ENDCLASS.

I’m curious to hear what feedback you have on the templates above, and if you have suggestions for improvement.

Happy testing!

If you would like to comment on this post, please head over to SAP Community.