With mockA it is quite easy to mock interfaces for unit tests. But it is also capable of creating mock objects that are not based only on interfaces, but specific classes. This blog post shows how it works and what needs to be considered.
Creating such an instance is quite the same as the creation of mock objects based on interfaces. The only restriction that applies is the fact that the class which is to be mocked may not be final class. This is necessary because mockA couldn’t create a subclass to override method outputs.
The classes in the following examples can be found in the mockA package provided at Github.
DATA lo_mocker TYPE REF TO zif_mocka_mocker. DATA lo_mocker_method TYPE REF TO zif_mocka_mocker_method. DATA lo_flight_observer TYPE REF TO zcl_mocka_flight_observer. lo_mocker = zcl_mocka_mocker=>zif_mocka_mocker~mock( zcl_mocka_flight_observer=>gc_name ). lo_mocker_method = lo_mocker->method( 'observe_flight' ). lo_mocker_method->with( i_p1 = 'NA' i_p2 = 007 i_p3 = sy-datlo ). lo_mocker_method->returns( abap_true ). lo_flight_observer ?= lo_mocker->generate_mockup( ).
However, this little example will still fail, as ZCL_MOCKA_FLIGHT_OBSERVER’s constructor expects non-optional IMPORTING parameters. This is an issue which is not existent for interfaces. As you mock already existing implementations, you also need to take care of that.
But that is also no problem at all. Consider the following example that passes some earlier created instances to the constructor. It can be achieved by calling the method PASS_TO_SUPER_CONSTRUCTOR of the mocker instance.
DATA lo_is_in_time_info TYPE REF TO zif_mocka_is_in_time_info. DATA lo_flight_alert_process TYPE REF TO zif_mocka_flight_alert_process. *create lo_is_in_time_info and lo_flight_alert_process... (not shown here) DATA lo_mocker TYPE REF TO zif_mocka_mocker. DATA lo_mocker_method TYPE REF TO zif_mocka_mocker_method. DATA lo_flight_observer TYPE REF TO zcl_mocka_flight_observer. lo_mocker = zcl_mocka_mocker=>zif_mocka_mocker~mock( zcl_mocka_flight_observer=>gc_name ). lo_mocker->pass_to_super_constructor( i_p1 = lo_flight_alert_process i_p2 = lo_is_in_time_info ). *mock some method output (not shown here) lo_flight_observer ?= lo_mocker->generate_mockup( ).
The example s are also in the mockA package.
Take a look at the unit test report ZTEST_CL_MOCKA_MOCKER and the test methods mock_class_with_construc_param, mock_class_with_method_output and mock_intf_with_construc_param.