从逻辑中分离数据访问

单元测试的一个重要原则是将数据访问与业务逻辑分开。一种有效的技术是定义数据访问接口。你的主类始终使用对该接口的引用,而不是直接读取或写入数据。

在生产代码中,主类将被赋予一个包装实际数据访问的对象。这可能是 select 语句,函数 mudule 调用,真的。重要的是这个类不应该执行任何其他操作。没有逻辑。

在测试主类时,你给它一个服务静态伪造数据的对象。

访问 SCARR 表的示例

数据访问接口 ZIF_DB_SCARR

INTERFACE zif_db_scarr
  PUBLIC.
    METHODS get_all
      RETURNING
        VALUE(rt_scarr) TYPE scarr_tab .
ENDINTERFACE.

假数据类和测试类:

CLASS lcl_db_scarr DEFINITION.
  PUBLIC SECTION.
    INTERFACES: zif_db_scarr.
ENDCLASS.

CLASS lcl_db_scarr IMPLEMENTATION.
  METHOD zif_db_scarr~get_all.
    " generate static data here
  ENDMETHOD.
ENDCLASS.

CLASS lcl_test DEFINITION
  FOR TESTING
  DURATION SHORT
  RISK LEVEL HARMLESS.

  PRIVATE SECTION.
    DATA:
      mo_cut TYPE REF TO zcl_main_class.

    METHODS:
      setup.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
  METHOD setup.
    DATA: lo_db_scarr TYPE REF TO lcl_db_scarr.

    CREATE OBJECT lo_db_scarr.

    CREATE OBJECT mo_cut
      EXPORTING
        io_db_scarr = lo_db_scarr.
  ENDMETHOD.
ENDCLASS.

这里的想法是,在生产代码中,ZCL_MAIN_CLASS 将获得一个 ZIF_DB_SCARR 对象,该对象执行 SELECT 并返回整个表,而单元测试针对在单元测试包含中定义的静态数据集运行。