{"ref":"artifact:greltel-abap-test-kit","page":"/artifacts/greltel-abap-test-kit","json":"/artifacts/greltel-abap-test-kit.json","generated":"2026-11-09","drafted_with_ai":true,"entity":{"id":"greltel-abap-test-kit","name":"ABAP Test Kit","artifact_type":"package","ecosystem":"abap","domain":"developer-experience","origin_ring":"independent","use_as":"dependency","flavors":[{"key":"abap-cloud","source":{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README","checked":"2026-11-03","quote":"The library is written against the **ABAP for Cloud Development** language version, follows\n**Clean Core** principles, and consumes **released APIs only**."}}],"description":{"one_line":"A library that puts a fluent API on SAP's ABAP Test Double Framework: dummy, stub, spy and mock doubles of a global interface from one facade class, written against the ABAP for Cloud Development language version.","short":"Fluent test doubles for ABAP Unit around CL_ABAP_TESTDOUBLE","what_it_solves":"Configuring a double with SAP's [ABAP Test Double Framework](artifact:abap-test-double-framework) takes two statements, `configure_call( )` and a call that looks like a real call but only records its arguments, and a call that matches no configuration returns initial values without saying so. This keeps that engine and puts a fluent API in front of it: `stub( )` answers through `when( )->with( )->returns( )`, `spy( )` records calls so the checks are written after the act step as `was_called( )->with( )->times( )`, `mock( )` declares every call up front and fails at an undeclared one, and `dummy( )` fills a collaborator the scenario never calls. Method names, parameter names and values are checked against the doubled type while the rule is written, and every mistake surfaces through one exception class, `ZCX_ATK`, whose text carries what went wrong, how to fix it, and the facts — the arguments, and the method and line of the code under test that made the call, read from the XCO call stack. It doubles global interfaces only, and `ZCL_ATK` is declared `FOR TESTING`, so production code cannot depend on it.","when_not_to_use":"Classes cannot be doubled: `ZCL_ATK` takes the name of a global interface, and a class is rejected with a message that says to extract an interface or to double the class with `CL_ABAP_TESTDOUBLE` directly; local interfaces of a test include cannot be named either. Static methods and events of the doubled interface are not doubled, and `with( )` compares for equality, with matchers listed as planned. Below SAP S/4HANA 2023, or outside the ABAP for Cloud Development language version, the prerequisites the README names are not met.","to_build_on_it":"The README lists the planned work in order: assertions on `CL_ABAP_UNIT_ASSERT` with matchers for tables, structures and exceptions, then a testability analyzer as an ATC check or [abaplint](artifact:abaplint-abaplint) rules that also finds mocks without `verify( )`, then koans; on the doubles themselves, consecutive answers, matchers for `with( )`, argument capture, events, and generic sorted and hashed tables. The code is MIT-licensed and pulled with [abapGit](artifact:abapgit-abapgit) into three packages, and its own 177 unit tests run against the real framework on a system and off-stack on every push with the [@abaplint/transpiler](artifact:abaplint-transpiler)."},"links":{"repo":"https://github.com/greltel/abap-test-kit"},"maintainers":["actor:greltel"],"provides":[{"capability":"capability:abap-unit-testing","what_it_does":"Hands out dummy, stub, spy and mock doubles of a global interface from one facade class, with fluent configuration of the answers and fluent checks of the calls, and failure messages that name the differing parameter and the line of the code under test that made the call.","sources":[{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README","checked":"2026-11-03","quote":"A small library that makes ABAP Unit tests with test doubles shorter and easier to read, for\ndevelopment on SAP S/4HANA and SAP BTP ABAP Environment."},{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README, Available Test Doubles","checked":"2026-11-03","quote":"Every double follows the same shape: `ZCL_ATK` is the only entry point and takes\nthe name of a global interface."},{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README, Design Goals-Features","checked":"2026-11-03","quote":"* Test code only — `ZCL_ATK` is `FOR TESTING`, so production code cannot depend on it"},{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README, Spy","checked":"2026-11-03","quote":"A failed check\nshows the expected arguments, the closest actual call with the method and line it\ncame from, and the parameters that differ."}]}],"requires":[{"ref":"artifact:abap-test-double-framework","for":"Creates the doubles and intercepts the calls; this library adds the fluent configuration, the checks and the messages on top, and names the framework under Prerequisites.","requirement":"required","basis":"binding","role":"framework","sources":[{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README","checked":"2026-11-03","quote":"It is built on top of SAP's ABAP Test Double Framework (`CL_ABAP_TESTDOUBLE`): the framework\nstill creates the doubles and intercepts the calls, the library adds a fluent API to configure\nand check them, and messages that say what went wrong and how to fix it."},{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README, Prerequisites","checked":"2026-11-03","quote":"* ABAP Test Double Framework (`CL_ABAP_TESTDOUBLE`)"}]},{"ref":"artifact:abapgit-abapgit","for":"Installs the library into the system: the README gives abapGit as the installation route, into a package flagged as ABAP Cloud in the customer namespace, with two sub-packages created in ADT before the pull.","requirement":"required","basis":"binding","role":"installation","sources":[{"url":"https://github.com/greltel/abap-test-kit","title":"greltel/abap-test-kit — README, Installation","checked":"2026-11-03","quote":"Install via [abapGit](https://abapgit.org) into a package flagged as\n**ABAP Cloud** in the customer namespace, e.g. `ZATK`."}]}],"provenance":{"discovered_via":[{"source":"source:github"}],"first_seen":"2026-11-03"},"drafted_with_ai":true,"contributors":["actor:greltel"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"2 contributors"},{"label":"Repository","tier":"good","evidence":"pushed 2026-11, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"unknown","evidence":"not read on ABAP: its lines run side by side"},{"label":"Maintainer's CI","tier":"good","evidence":"ABAP Unit Testing green, 2026-11-01"}],"practice":[{"label":"Tests","tier":"good","evidence":"11 test files"},{"label":"Docs","tier":"good","evidence":"README 30 KB"},{"label":"Changelog","tier":"good","evidence":"CHANGELOG in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":3,"unit":"watching"}]},"signals":{"crawled_at":"2026-11-08","npm":"not published under this name","stars":3,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-11-01","language":"ABAP","license_spdx":"MIT","org_owned":false,"default_branch":"main","created_at":"2026-09-24T20:01:22Z","open_prs":0,"tree_truncated":false,"test_files":11,"workflows":2,"other_ci":false,"readme_bytes":30789,"docs_files":0,"changelog":true,"license_file":true,"dts_files":0,"first_commit":"2026-09-24","last_commit":"2026-11-01","commits":174,"contributors":2,"ci_status":"success","ci_run_at":"2026-11-01","ci_workflow":"ABAP Unit Testing","ci_event":"push","readme_path":"README.md","readme_sha":"2806b6622594042f08cae6ebfd2b4f7c31e2fc1f","repo_read":"2026-11-08"},"release_notes":{"license":"MIT","quotable":true,"source":{"kind":"repo","path":"CHANGELOG.md","ref":"main","url":"https://github.com/greltel/abap-test-kit/blob/main/CHANGELOG.md"},"format":"keep-a-changelog","releases":[{"version":"1.1.1","date":"2026-10-31","date_source":"heading","heading":"[1.1.1] - 2026-10-31","url":"https://github.com/greltel/abap-test-kit/blob/main/CHANGELOG.md#111---2026-10-31","sections":[{"kind":"change","heading":"Changed","items":3},{"kind":"fix","heading":"Fixed","items":1}],"hash":"a45c54842a98314a"},{"version":"1.1.0","date":"2026-09-27","date_source":"heading","heading":"[1.1.0] - 2026-09-27","url":"https://github.com/greltel/abap-test-kit/blob/main/CHANGELOG.md#110---2026-09-27","sections":[{"kind":"feature","heading":"Added","items":1},{"kind":"change","heading":"Changed","items":5},{"kind":"fix","heading":"Fixed","items":10}],"hash":"a4740bd5103551ea"},{"version":"1.0.0","date":"2026-09-26","date_source":"heading","heading":"[1.0.0] - 2026-09-26","url":"https://github.com/greltel/abap-test-kit/blob/main/CHANGELOG.md#100---2026-09-26","sections":[{"kind":"feature","heading":"Added","items":9}],"hash":"7a802826a803dfa9"}],"crawled_at":"2026-11-08"},"edges":{"maintainers":[{"ref":"actor:greltel","name":"George Drakos","json":"/actors/greltel.json"}],"contributors":[{"ref":"actor:greltel","name":"George Drakos","json":"/actors/greltel.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_on_to":{"ref":"artifact:abap-test-double-framework","name":"ABAP Test Double Framework","json":"/artifacts/abap-test-double-framework.json"},"add_ons":[],"answered_through_parts":[]}}