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
相关产品推荐
相关产品推荐

