为什么构造函数在提交后又被调用?

问题描述 投票:0回答:1

我有以下全局类,它应该保存对

IF_OSQL_TEST_ENVIRONMENT
的引用作为静态属性。

CLASS zcl_static_holder DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    CLASS-DATA sr_osql_test_environment TYPE REF TO if_osql_test_environment .

    CLASS-METHODS class_constructor .
    CLASS-METHODS set_osql_test_environment
      IMPORTING
        !ir_osql_test_environment TYPE REF TO if_osql_test_environment .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_static_holder IMPLEMENTATION.


  METHOD class_constructor.
    BREAK-POINT.
  ENDMETHOD.


  METHOD set_osql_test_environment.
    sr_osql_test_environment = ir_osql_test_environment.
  ENDMETHOD.
ENDCLASS.

现在我在以下程序的单元测试中设置此静态属性。在通过 setter 初始化静态属性之前,会调用上述类的类构造函数。然而,提交报告后,类构造函数被第二次调用,并且静态属性当然不再设置。

REPORT zsubmit_with_static_holder.

CLASS lcl_test DEFINITION FINAL FOR TESTING
  RISK LEVEL HARMLESS DURATION SHORT.
  PUBLIC SECTION.
    METHODS:
      test FOR TESTING.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
  METHOD test.
    DATA(lr_osql_test_environment) = cl_osql_test_environment=>create(
      VALUE #( ( 'T100' ) )
    ).
    zcl_static_holder=>set_osql_test_environment( lr_osql_test_environment ).

    SUBMIT zsubmit_with_static_holder
      AND RETURN.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  IF zcl_static_holder=>sr_osql_test_environment IS NOT BOUND.
    WRITE / 'Not bound.'.
  ENDIF.
  SELECT COUNT( * ) FROM t100.
  IF sy-subrc <> 0.
    WRITE / 'No entries. Table mocked!'.
  ENDIF.

为什么会这样?我怎样才能让它发挥作用?我发现了一些关于数据库 LUW 和 SAP LUW 的信息,它可以通过共享内存对象来解决,另一方面,对于在单元测试中如此简单的使用来说,共享内存对象看起来非常复杂。

unit-testing oop constructor abap
1个回答
3
投票

SUBMIT
启动新的内部会话,因此所有程序都会再次加载。

最好在类中开始选择后移动代码并调用此类,而不是使用

SUBMIT

如果你无法避免

SUBMIT
,我认为没有解决办法,但谁知道呢。

© www.soinside.com 2019 - 2024. All rights reserved.