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

SUBMIT后类构造函数为何重复调用?静态属性丢失如何解决?

问题原因

当执行SUBMIT zsubmit_with_static_holder AND RETURN时,系统会创建一个新的ABAP内部会话。ABAP中全局类的静态属性与所在内部会话绑定,每个内部会话拥有独立的类静态变量上下文。在新会话里,zcl_static_holder类未被初始化,因此会触发类构造函数重新调用,原会话中设置的静态属性sr_osql_test_environment无法被新会话继承,最终导致属性值丢失。

注:核心原因是内部会话的隔离性,而非数据库LUW或SAP LUW的差异——LUW主要影响事务边界,静态变量的隔离是会话级别的特性。

解决方案(针对单元测试场景的轻量方案)

方案1:通过ABAP内存传递对象引用

利用ABAP内存导出/导入机制,在SUBMIT前将对象引用存入内存,在目标程序中取出并初始化静态属性:

  • 单元测试中初始化静态属性后,添加导出代码:
    DATA(lo_test_env) = zcl_static_holder=>get_osql_test_environment( ). "假设存在getter方法
    EXPORT lo_test_env TO MEMORY ID 'Z_OSQL_TEST_ENV'.
    
  • 在zsubmit_with_static_holder程序的初始化逻辑中,导入内存对象并赋值:
    DATA(lo_test_env) = NEW if_osql_test_environment( ).
    IMPORT lo_test_env FROM MEMORY ID 'Z_OSQL_TEST_ENV'.
    IF lo_test_env IS BOUND.
      zcl_static_holder=>set_osql_test_environment( lo_test_env ). "调用setter方法
    ENDIF.
    
  • 测试结束后可清理内存(避免影响其他程序):
    FREE MEMORY ID 'Z_OSQL_TEST_ENV'.
    

方案2:重构SUBMIT程序以脱离全局静态类依赖

若zsubmit_with_static_holder的逻辑允许,可将原本依赖静态属性的逻辑改为接收简单类型参数,或通过函数模块间接传递对象引用。此方案仅适用于可拆分逻辑的场景,因为SUBMIT无法直接传递对象引用。

方案3:调整单元测试结构避免跨会话依赖

如果使用SAP ABAP单元测试框架,可将测试环境实例通过测试类的属性传递,而非依赖全局静态类。需确保SUBMIT的逻辑能被测试框架覆盖,或调整测试流程以避免跨会话的静态属性依赖。

内容的提问来源于stack exchange,提问作者Jagger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:55:37