模拟导出参数时,Test Double Framework引发异常

2020-09-22 14:20发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好社区, ...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好社区,

当从本地模拟实现过渡到Test Double Framework时,我在使用它对接口上带有 Exporting Parameter 的方法进行双重处理时遇到了一个问题。 当测试方法从"新"双重实例中导入值时,该实例在生成双重类时首次调用该实例中的方法时,将引发CX_ATD_EXCEPTION。

我什至发现了

此博客文章介绍了该框架,但是用于导出参数的示例未将其值导入测试方法中。 将代码复制到系统并接收它们会触发相同的框架异常。

奇怪的是,当两次调用该方法时,但仅在第二次调用中接收到它的值时,它才能按预期工作。

下面是此行为的示例代码。 一个简单的全局界面:

界面zif_test_df public。
   方法is_account_open
     导入i_number类型i
     导出值(e_is_open)键入abap_bool。
 终端接口。
 

单元测试代码:

报告zp_test_df。

 ltc_test类定义风险等级无害持续时间,测试短。
   私人部分。
     方法设置。
     方法fail_when_importing_firstcall进行测试。
     方法passs_when_importng_secndcall进行测试。

     数据m_mock类型引用到zif_test_df。
     数据m_result类型为abap_bool。
 结束类。

 ltc_test类的实现。
   方法设置。
     m_mock?= cl_abap_testdouble => create('ZIF_TEST_DF')。
     cl_abap_testdouble => configure_call(m_mock)-> set_parameter(name ='E_IS_OPEN'value = abap_true)。
   方法。

   方法fail_when_importing_firstcall。
     "使用'[ABAP Testdouble Framework]导入配置调用中不允许的参数来提高CX_ATD_EXCEPTION。使用SET_PARAMETER'
     m_mock-> is_account_open(
       导出i_number = 123
       导入e_is_open = m_result
     )。
   方法。

   方法passs_when_importng_secndcall。
     "首先调用,它会正确初始化double实例。
     m_mock-> is_account_open(
       导出i_number = 123
 *导入ev_is_open = m_result
     )。
     "第二次调用有效,并且m_result从double FW接收值。
     m_mock-> is_account_open(
       导出i_number = 123
       导入e_is_open = m_result
     )。
   方法。
 结束类。
 

单元测试结果:

(18.8 kB)
3条回答
半个程序猿
2020-09-22 15:18 .采纳回答

实际上,在您的问题中,您给出了答案:"奇怪的是,当两次调用该方法时,它可以按预期工作。"

是的,该方法总是被"两次调用"。

"配置调用"之后的第一个调用是输入参数值的注册(即使不需要特定值,例如,一个没有输入参数的方法,或其所有参数都将被忽略 )。

(在被测代码中)下一次调用将返回配置的值。

给人一种错误的感觉,即该模拟方法将被调用两次,因为您的代码在"测试测试"中非常特殊。

在正常用法中,您可以通过定义模拟值(返回,导出,引发异常,引发事件)来配置调用,然后设置对配置调用有效的输入参数的值,然后测试您的 被测代码,通过将测试双精度作为参数传递,这将调用您的测试双精度的某些方法。

您的代码应如下所示:

付款方式。 测试代码
   如果不是account-> is_account_open(i_number)。
     引发例外类型lx_account_closed。
   万一。
 方法。

 方法right_way。  " 用于检测
   "鉴于已开设的帐号为123
   "当有付款时
   "那么就不应该出现错误的"帐户已关闭"

   mocked_account?= cl_abap_testdouble => create('ZIF_TEST_DF')。
   "设置输出值
   cl_abap_testdouble => configure_call(mocked_account)-> set_parameter(name ='E_IS_OPEN'value = abap_true)。
   "设置输入值
   mocked_account-> is_account_open(输出i_number = 123)。

   切=新交易(嘲笑账户)。
   尝试。
       cut-> do_payment(帐户= 123金额= '15 .99')。
     捕获lcx_account_closed INTO DATA(lx_account_closed)。
   ENDTRY。

   cl_abap_unit_assert => assert_not_bound(lx_account_closed)。
 终止方法。

一周热门 更多>