Following official documentation we're supposed to write unit tests using following template
cl_abap_unit_assert=>assert_equals( act = myclass=>text
exp = 'X' ).
The only function this library delivers - it allows us to use shorter construction like this:
assert( myclass=>text )->equals( 'X' ).
To use this library you need to use ZCL_ASSERTABLE_UNIT
class as a base class for your test class.
CLASS ltcl_main DEFINITION INHERITING FROM zcl_assertable_unit
FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
...
endclass.
then later in your code you can just use something like:
assert( 1 )->not_initial( ).
assert( 1 )->eq( 1 ).
assert( 1 )->ne( 2 ).
assert( new ltcl_main( ) )->bound( ).
assert( not_bound )->not_bound( ).
assert( abap_true )->true( ).
assert( abap_false )->false( ).
It might be helpful to use assert interface in a normal runtime, not only in unit tests.
data(assert) = new zcl_assertable( ).
assert->assert( 1 )->not_initial( ).
or if your class is inherited from ZCL_ASSERTABLE then simply like this
assert( 1 )->not_initial( ).
alternatively you can implement zif_assert interface right in your class:
class zcl_your_class definition.
public section.
interfaces zif_assertable.
private section.
aliases assert for zif_assertable~assert.
methods some_method.
endclass.
class zcl_your_class implementation.
method zif_assertable~assert.
result = new zcl_assertable( actual = actual ).
endmethod.
method some_method.
assert( some_value )->eq( another_value ).
endmethod.
endclass.
PLease notice in this case if zcl_assert_local interface will be extended ( with methods/parameters ) you will have to support this change too in your class.
One more feature which local asserts bring is a resumable exception. For example you can assert and catch assertion exception (which native asserts do not support BTW).
try.
assert( ref )->is_bound( ).
catch zcx_assertable.
" some exception handling
endtry.
Since ZCX_ASSERTABLE
is a no-check exception you can bring it higher and do even more advanced logic
method main.
try.
do_something( ref ).
catch before unwind zcx_assertable.
" fix the problem here
ref = new #( ).
resume.
endtry.
endmethod.
method do_something.
assert( ref )->is_bound( ).
endmethod.