ABAP单元测试覆盖不全:如何覆盖zcl_test=>export_pass_id代码行?
解决ABAP单元测试覆盖
zcl_test=>export_pass_id代码行的问题 要覆盖目标方法里的zcl_test=>export_pass_id代码行,核心是让逻辑走到IF mv_save_id_pass = abap_true分支中。以下是具体实现步骤:
1. 关键逻辑拆解
目标方法里,mv_save_id_pass初始被CLEAR,后续值由mo_popup->call_0600()的执行结果决定。要触发if分支,必须让call_0600()执行后将mv_save_id_pass设为abap_true。同时需要模拟mo_model->prep_id_pass(),避免依赖实际业务逻辑,保证测试独立性。
2. 用测试双打模拟依赖对象
借助ABAP单元测试的cl_abap_testdouble框架,模拟mo_popup和mo_model的行为:
2.1 模拟mo_model->prep_id_pass()
该方法仅给mt_pass_id赋值,测试时无需关心具体值,直接返回空内表即可:
DATA(lo_model_dbl) = cl_abap_testdouble=>create( mo_app->mo_model ). cl_abap_testdouble=>configure( lo_model_dbl )->method( 'prep_id_pass' )->returning( VALUE #() ).
2.2 模拟mo_popup->call_0600()设置mv_save_id_pass = abap_true
通过测试双打的回调函数,在call_0600执行时修改目标类的mv_save_id_pass变量:
DATA(lo_popup_dbl) = cl_abap_testdouble=>create( mo_app->mo_popup ). DATA(lv_callback_code) TYPE string. lv_callback_code = `me->mv_save_id_pass = abap_true.`. cl_abap_testdouble=>configure( lo_popup_dbl )->method( 'call_0600' )->callback( VALUE #( name = mo_app->get_class_name( ) method = 'SET_PASS_ID' code = lv_callback_code ) ).
3. 验证zcl_test=>export_pass_id的调用
模拟静态方法zcl_test=>export_pass_id,并验证它是否按预期被调用:
DATA(lo_test_dbl) = cl_abap_testdouble=>create( 'ZCL_TEST' ). cl_abap_testdouble=>configure( lo_test_dbl )->method( 'EXPORT_PASS_ID' )->expecting( EXPORTING iv_pass_id = zslo_vehicle_list_screen-zzpass_id ).
4. 修改后的完整测试代码
METHOD set_pass_id_save_scenario. " 准备测试数据 zslo_vehicle_list_screen-zzpass_id = '2'. " 模拟mo_model的prep_id_pass方法 DATA(lo_model_dbl) = cl_abap_testdouble=>create( mo_app->mo_model ). cl_abap_testdouble=>configure( lo_model_dbl )->method( 'prep_id_pass' )->returning( VALUE #() ). " 模拟mo_popup的call_0600方法,设置mv_save_id_pass为true DATA(lo_popup_dbl) = cl_abap_testdouble=>create( mo_app->mo_popup ). DATA(lv_callback_code) TYPE string. lv_callback_code = `me->mv_save_id_pass = abap_true.`. cl_abap_testdouble=>configure( lo_popup_dbl )->method( 'call_0600' )->callback( VALUE #( name = mo_app->get_class_name( ) method = 'SET_PASS_ID' code = lv_callback_code ) ). " 模拟zcl_test的export_pass_id方法并验证参数 DATA(lo_test_dbl) = cl_abap_testdouble=>create( 'ZCL_TEST' ). cl_abap_testdouble=>configure( lo_test_dbl )->method( 'EXPORT_PASS_ID' )->expecting( EXPORTING iv_pass_id = zslo_vehicle_list_screen-zzpass_id ). " 执行目标方法 mo_app->set_pass_id( iv_vstel = '4006' ). " 验证静态方法调用 cl_abap_testdouble=>verify( lo_test_dbl ). ENDMETHOD. METHOD set_pass_id_cancel_scenario. " 保留原取消场景测试逻辑 TRY . mo_app->set_pass_id( iv_vstel = '4006' ). cl_abap_unit_assert=>assert_false( abap_true ). " 不应执行到此处 CATCH zcx_common. cl_abap_unit_assert=>assert_equals( act = '008' exp = sy-msgno ). ENDTRY. ENDMETHOD.
注意事项
- 替换代码中的
ZCL_YOUR_APP_CLASS为目标方法所属的实际类名 - 确保测试类已正确注入
mo_app、mo_model、mo_popup等依赖对象 - 测试结束后记得清理测试双打对象:
cl_abap_testdouble=>destroy( lo_model_dbl )
内容的提问来源于stack exchange,提问作者Alexander Chebotarev
相关产品推荐
相关产品推荐

