Lilienthal
Lilienthal

Reputation: 4378

Boolean Assert in ABAP Unit

How do I write a simple ABAP Unit Assert statement to check if any call, expression or other statement evaluates to true?

I can't see any basic assert() or assert_true() methods in CL_AUNIT_ASSERT while I'd expect those to be very common. I can approximate such an assert as follows, but is there no cleaner way?

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 ).

Upvotes: 4

Views: 1649

Answers (4)

Damir
Damir

Reputation: 56

Depending on your SAP NetWeaver stack you can (or should) use the updated ABAP Unit Class CL_ABAP_UNIT_ASSERT. This class is available at a Basis-Release >= 7.02. SAP declared this class as 'FINAL' so it´s impossible to inherit from it, but on the other side they added some ASSERT-Methods like the ASSERT_TRUE Method!

Here is a possible usage of this method:

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 }'
).

Upvotes: 3

Mike Pokraka
Mike Pokraka

Reputation: 31

The cleanest way is to just fail:

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

Or a more informative: cl_abap_unit=>fail( msg = 'Limit exceeded' ).

Upvotes: 2

Jagger
Jagger

Reputation: 10514

You cannot see such methods because there is no boolean type in ABAP.

While in Java, C++ or C, you are able to assign a result of a condition to a variable, like this

int i = 5;
boolean result = i > 3;

You cannot do the same thing in ABAP as there is no boolean type. Therefore what in other languages is a one liner, in ABAP it will always be more prolix.

DATA: i TYPE i VALUE 5.
DATA: result TYPE abap_bool.

IF i > 3.
  result = abap_true.
ELSE.
  result = abap_false.
ENDIF.

The thing you used seems to be a new feature, that has been recently added to the language and most of the customers will not be using for a long time. Also the CL_AUNIT_ASSERT class was created way before the new elements came to the language.

So right now, there is a possibility to write the above thing as one liner. However there is still no boolean type in the language.

DATA: i TYPE i VALUE 5.
DATA: result TYPE abap_bool.

result = boolc( i > 3 ).

On the other hand, there is no boolean type, but you could simply use ASSERT_INITIAL or ASSERT_NOT_INITIAL in this case, as boolean is emulated by either X (true) or space (false). The latter is an initial value in ABAP.

Upvotes: 2

vwegert
vwegert

Reputation: 18483

For the releases I have access to, there's probably no shorter way than the one you outlined. You can create a subclass of CL_AUNIT_ASSERT and add your own static ASSERT_TRUE method. It's not a bad idea to do so and at the same time make your local ABAP Unit test class a subclass of that ZCL_AUNIT_ASSERT - this way, you can omit the cl_aunit_assert=> prefix which will save some keystrokes.

Upvotes: 2

Related Questions