如何编写一个简单的ABAP单元断言语句来检查是否有任何调用、表达式或其他语句的计算结果为true?
我在CL_AUNIT_ASSERT
中看不到任何基本的assert()
或assert_true()
方法,但我希望它们非常常见。我可以近似这样一个断言,但没有更干净的方法吗?
cl_aunit_assert=>assert_equals(
act = boolc( lv_value > 100 OR lv_value < 2 )
exp = abap_true ).
cl_aunit_assert=>assert_equals(
act = mo_model->is_active )
exp = abap_true ).
根据您的SAP NetWeaver堆栈,您可以(或应该)使用更新的ABAP单元类CL_ABAP_UNIT_ASSERT
。此类可在基本版本>=7.02中获得。SAP将此类声明为"FINAL",因此不可能从中继承,但另一方面,他们添加了一些ASSERT方法,如ASSERT_TRUE
方法!
以下是这种方法的可能用法:
cl_abap_unit_assert=>assert_true(
exporting
act = m_ref_foo->is_bar( l_some_var )
msg = 'is_bar Method fails with Input { l_some_var }'
).
对于我可以访问的版本,可能没有比您概述的方法更短的方法了。您可以创建CL_AUNIT_ASSERT
的子类,并添加自己的静态ASSERT_TRUE
方法。这样做并不是一个坏主意,同时使您的本地ABAP单元测试类成为ZCL_AUNIT_ASSERT
的子类-这样,您可以省略cl_aunit_assert=>
前缀,这将节省一些按键。
您无法看到这样的方法,因为ABAP中没有布尔类型。
在Java、C++或C中,您可以将条件的结果分配给变量,如
int i = 5;
boolean result = i > 3;
您不能在ABAP中做同样的事情,因为没有布尔类型。因此,在其他语言中是一行的东西,在ABAP中总是更加冗长。
DATA: i TYPE i VALUE 5.
DATA: result TYPE abap_bool.
IF i > 3.
result = abap_true.
ELSE.
result = abap_false.
ENDIF.
你使用的东西似乎是一个新功能,最近添加到了语言中,大多数客户在很长一段时间内都不会使用。此外,CL_AUNIT_ASSERT
类是在新元素出现在该语言之前创建的。
所以现在,有可能把上面的事情写成一行。然而,该语言中仍然没有布尔类型。
DATA: i TYPE i VALUE 5.
DATA: result TYPE abap_bool.
result = boolc( i > 3 ).
另一方面,没有布尔类型,但在这种情况下可以简单地使用ASSERT_INITIAL
或ASSERT_NOT_INITIAL
,因为布尔类型由X
(true)或space(false)模拟。后者是ABAP中的初始值。
最干净的方法就是失败:
if value > limit.
cl_abap_unit_assert=>fail( ).
endif.
或者提供更多信息:cl_abap_unit=>fail( msg = 'Limit exceeded' ).