ABAP单元中的布尔断言



如何编写一个简单的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_INITIALASSERT_NOT_INITIAL,因为布尔类型由X(true)或space(false)模拟。后者是ABAP中的初始值。

最干净的方法就是失败:

if value > limit. 
  cl_abap_unit_assert=>fail( ). 
endif.

或者提供更多信息:cl_abap_unit=>fail( msg = 'Limit exceeded' ).

相关内容

  • 没有找到相关文章