You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:38:29