How to create unit test for product determination function module CRM_ORDERADM_I_PROD_DETERM_OW
For more detail about how product determination works in one order scenario, please refer to this blog: Product Alternative ID used in Opportunity Line item product determination.





As a result, I plan to create corresponding dummy entry in these two database tables in the SETUP method of test class:
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_16 = mv_fake_prod_guid.
ls_mock_alt_id = VALUE #( product_guid = mv_fake_prod_guid
upname = sy-uname
altvehno = gv_altid ).
INSERT isam_o_veh_ids FROM ls_mock_alt_id.
DATA(prod) = VALUE comm_product( product_guid = mv_fake_prod_guid
product_id = gv_prod_id
product_type = '01' upname = sy-uname ).
INSERT comm_product FROM prod.
COMMIT WORK AND WAIT.
And remove them in TEARDOWN:
METHOD teardown.
DELETE FROM isam_o_veh_ids WHERE product_guid = mv_fake_prod_guid.
DELETE FROM comm_product WHERE product_guid = mv_fake_prod_guid.
COMMIT WORK AND WAIT.
ENDMETHOD.
In the meantime, the determination function module needs a guid for one order header object ORDERADM_H. When the function module is executed, the header data will be read from buffer. In my unit test, in order to ensure that the header read from buffer succeed, I have to first insert the buffer of dummy object header via the following code in SETUP method:
DATA: ls_mock_header TYPE crmt_orderadm_h_wrk,
ls_mock_alt_id TYPE isam_o_veh_ids,
lt_link TYPE crmt_link_comt,
ls_link LIKE LINE OF lt_link.
CREATE OBJECT f_cut.
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_16 = mv_header.
ls_mock_header-guid = mv_header.
ls_mock_header-process_type = gv_oppt_proc_type.
CALL FUNCTION 'CRM_ORDERADM_H_PUT_OB'
EXPORTING
is_orderadm_h_wrk = ls_mock_header.
The complete source code could be found from here.






As displayed above, I have two test methods DETERMINE_OK and DETERMINE_FAIL to test these two boundary conditions.