Show TOC

Komplexe Vergleiche von ABAP-ObjektenLocate this document in the navigation structure

Verwendung

Sie können eine besondere Funktion der Methode CL_ABAP_UNIT_ASSERT=>ASSERT_EQUALS nutzen, um komplexe Vergleiche zwischen erwarteten und tatsächlichen Objektreferenzen durchzuführen. Standardmäßig testet ASSERT_EQUALS Objektreferenzen, die auf das gleiche Objekt zeigen.

Sie können komplexe Objektvergleiche wie folgt ausführen:

  1. Sie implementieren eine Klasse zur Testverifizierung, die das Interface IF_AUNIT_OBJECT implementiert.

    Ihre spezielle Logik zum Vergleich eines referenzierten Objekts mit seinem Testgegenstück muss in der Methode EQUALS_TO von IF_AUNIT_OBJECT implementiert sein.

  2. Sie übergeben eine Instanz Ihrer Klasse zur Testverifizierung an CL_ABAP_UNIT_ASSERT->ASSERT_EQUALS als Argument des Parameters EXP.

    EXP enthält das Datenobjekt, das als Ergebnis des Modultests erwartet wird. Das Objekt EXP ist der Standard, gegen den das durch den Modultest erzeugte Objekt geprüft wird.

Beispiel

Angenommen, eine zu testende Methode erzeugt eine Instanz einer globalen Klasse. Nach Aufruf der Methode MAIN muss eine der folgenden Bedingungen wahr sein.

  • Wenn VEHICLE_TYPE der Instanz von CL_TEST_CLASS den Wert TYPE_1 hat, dann sollte NR_WHEELS den Konstantenwert C_HAS_TWO_WHEELS haben.

  • Wenn VEHICLE_TYPE der Instanz von CL_TEST_CLASS den Wert TYPE_2 hat, dann sollte NR_WHEELS den Konstantenwert C_HAS_3_WHEELS oder C_HAS_4_WHEELS haben.

Sie können in einem Modultest mit CL_ABAP_UNIT_ASSERT->ASSERT_EQUALS und einer Implementierung von IF_AUNIT_OBJECTüberprüfen, ob diese Bedingungen erfüllt werden.

Nachfolgend finden Sie die zu testende MAIN-Methode. Sie legt den Fahrzeugtyp und die Anzahl der Räder fest, letzteres auf Basis einer Differentiator-Eigenschaft.

METHOD MAIN.

  me->vehicle_type = vehicle_type.

* Set number of wheels.
  CASE vehicle_type.
    WHEN type_1.
      CASE differentiator.
        WHEN class_1.
          me->nr_wheels = c_has_two_wheels.
        WHEN OTHERS.
          me->nr_wheels = c_unknown.
      ENDCASE.
    WHEN type_2.
      CASE differentiator.
        WHEN class_9 or class_10.
          me->nr_wheels = c_has_three_wheels.
        WHEN class_4 or class_5.
          me->nr_wheels = c_has_four_wheels.
        WHEN OTHERS.
          me->nr_wheels = c_unknown.
       ENDCASE.
     WHEN OTHERS.
  ENDCASE.

ENDMETHOD.
            

Nachfolgend finden Sie den Quelltext für die Methode EQUALS_TO in einer Klasse, die IF_AUNIT_OBJECT implementiert. Mit dieser Methode wird das referenzierte Objekt in einem Modultest der obigen MAIN-Methode überprüft.

METHOD if_aunit_object~equals_to.

* Test whether the object reference created in the unit test
* meets one of these conditions:
* - If VEHICLE_TYPE of the instance of CL_TEST_CLASS has the value TYPE_1,
*   then NR_WHEELS should have the constant value C_HAS_TWO_WHEELS..
* - If VEHICLE_TYPE of the instance of CL_TEST_CLASS has the value TYPE_2,
*   then NR_WHEELS should either the constant value HAS_3_WHEELS or HAS_4_WHEELS. 
* ...

  CONSTANTS: type_1 TYPE c VALUE '1',
             type_2 TYPE c VALUE '2',
             c_has_two_wheels TYPE c VALUE '2',
             c_has_three_wheels TYPE c VALUE '3',
             c_has_four_wheels TYPE c VALUE '4'.

* Stand-in for a database table of permissible types
  TYPES: BEGIN OF t_types,
    vehicle_type TYPE c LENGTH 1,
    nr_wheels TYPE c LENGTH 1,
   END OF t_types.

  DATA vehicle TYPE REF TO cl_implement_if_aunit_object.

  DATA t_valid_types TYPE STANDARD TABLE OF t_types
    WITH DEFAULT KEY.
  DATA ls_valid_type TYPE t_types.

* Test data
  ls_valid_type-vehicle_type = type_1.
  ls_valid_type-nr_wheels = c_has_two_wheels.
  APPEND ls_valid_type TO t_valid_types.

  ls_valid_type-vehicle_type = type_2.
  ls_valid_type-nr_wheels = c_has_three_wheels.
  APPEND ls_valid_type TO t_valid_types.

  ls_valid_type-vehicle_type = type_2.
  ls_valid_type-nr_wheels = c_has_four_wheels.
  APPEND ls_valid_type TO t_valid_types.

  vehicle ?= other.

* Check whether the referenced object from the unit test
* has a permissible type and number of wheels combination
  result = abap_false.

  LOOP AT t_valid_types INTO ls_valid_type.
    IF vehicle->vehicle_type = ls_valid_type-vehicle_type.
      IF vehicle->nr_wheels = ls_valid_type-nr_wheels.
        result = abap_true.
        EXIT.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDMETHOD.
            

Im Folgenden finden Sie schließlich den Quelltext für eine Modultestmethode, die IF_AUNIT_OBJECT zur Überprüfung der MAIN-Methode verwendet. Der erste Aufruf von MAIN in der Testmethode übergibt den Modultest. Der zweite Aufruf von MAIN führt zu einem Modultestfehler.

CLASS lcl_Unit_Test IMPLEMENTATION.
* ===================================

  METHOD main.
* ============
    DATA vehicle_Type TYPE c LENGTH 1.
    DATA differentiator TYPE c LENGTH 1.
    DATA assertion_failed TYPE abap_bool.
    DATA lcl_aunit_object TYPE REF TO 
          cl_sp_test_aunit_object.

    CREATE OBJECT f_Cut.

    f_Cut->main(
        VEHICLE_TYPE = '1'
        DIFFERENTIATOR = 'A' ).

    CREATE OBJECT lcl_aunit_object.

    cl_abap_unit_assert=>assert_equals(
      EXPORTING
        exp                  = lcl_aunit_object
        act                  = f_Cut ).

    f_Cut->main(
        VEHICLE_TYPE = '2'
        DIFFERENTIATOR = 'F' ).

    cl_abap_unit_assert=>assert_equals(
      EXPORTING
        exp                  = lcl_aunit_object
        act                  = f_Cut ).

  ENDMETHOD.       "main