Komplexe Vergleiche von ABAP-Objekten 
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:
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.
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.
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.
Syntax
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.
Syntax
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.
Syntax
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