TEST-SEAM 和 TEST-INJECTION 一块儿使用 可以模拟出调用方法的return,exporting,chaning值。
例如:
1: 假设有一个类zcl_demo_input,该类的方法request会 EXPORTING一个值 input。 比如:前端框架的某个类,会接收用户输入的一些值给后台。
实际的环境中,用户会从页面输入值,我们也会需要调用该类来接收值。但是在unit test测试环境中,我们没有界面可控输入,我们就需要根据方法(function model,form等)返回的数据类型去模拟这些值。需要用到:TEST-SEAM 和 TEST-INJECTION
2:创建一个类,使用方法去调用第一步创建的方法。Unit test时,红色部分不会执行。会执行 unit test中的 test-injection。
method GET_INPUT. TEST-SEAM fake_input. "执行到该方法,会跳转到 test-injection fake_input 方法,并将
" test-injection fake_input 模拟的数据作为 下面语句执行的结果。 用于上下文测试。 zcl_demo_input=>request( IMPORTING field = input ). " 真实环境中,该方法会执行,测试类中调用该方法,这个语句不执行。 "使用 TEST-INJECTION fake_input 中定义的值作为该方法的exporting值,changing值或 returning 值。 END-TEST-SEAM. data a TYPE string. a = input. * input = 'yyy'. endmethod.
方法的返回值时input
3: 创建要给Unit test 方法调用第二步创建的方法。
*"* use this source file for your ABAP unit test classes class ztst definition for testing duration short risk level harmless . private section. data: f_Cut type ref to zcls. "class under test methods: get_Input for testing. endclass. "ztst class ztst implementation. method get_Input. TEST-INJECTION fake_input. input = 'xxx'. " 作为第二步红色代码的调用结果数据。 END-TEST-INJECTION. DATA(input) = NEW zcls( )->get_input( ). " 蓝色区域可以直接不用,只要在其它地方调用了 get_input方法就行。 cl_abap_unit_assert=>assert_equals( EXPORTING exp = 'xxx' act = input ). endmethod. endclass.
input = 'xxx'. 就是第二步红色代码真实执行环境应该得到的数据。 使用TEST-SEAM 和 TEST-INJECTION 模拟了出来,以供上下文使用。<style></style> <style></style>