Ein Java-API für Atrium
Atrium ist eine Multi-Platform Assertion Library für Kotlin. Im Rahmen der Open Source Week von Tegonal haben wir uns damit befasst, einen Generator basierend auf einem Kotlin Compiler-Plugin zu erstellen, welcher ein Java-API erzeugt, so dass Atrium auch für Java verfügbar ist.
Dabei haben wir folgende Ziele verfolgt:
- Die zur Verfügung stehenden Expectations sollen mittels Typ-Hierarchie analog zu AssertJ bereitgestellt werden
- Es sollen, im Gegensatz zu AssertJ, soweit möglich keine Typ-Informationen verloren gehen
- Es soll wo immer möglich das gleiche Pattern wie bei der Verwendung mit Kotlin fluent API angeboten werden, insbesondere auch in Bezug auf Exceptions/Throwables und Soft Assertions
Hier ein kleines Beispiel, wie Expectations auf Basis der erstellten Erweiterung in Java in einem Test abgebildet werden können:
Zum Ende der Woche konnte zwar kein Pull Request für Atrium erstellt werden, jedoch haben wir viele Erkenntnisse gewonnen, sollten wir in Zukunft einen Bedarf sehen, Atrium in Java Projekten einzusetzen. Momentan ist dies nicht der Fall, weil wir unsere Applikationen primär in Scala oder Kotlin umsetzen.
Zudem konnten wir uns Wissen beim Erstellen eines Kotlin Compiler-Plugins aneignen.
Wir möchten es aber nicht unterlassen, einige unserer Erkenntnisse in den folgenden Abschnitten mit euch zu teilen.
Take Aways – Java API
- Das Zurverfügungstellen eines kompletten Java-API ist aufgrund der fehlenden starken Typisierung und der Möglichkeit von «Extension-Functions» umständlich.
- Die Integration des aufrufenden Kotlin Codes im Java Umfeld wird von der IDE IntelliJ mangelhaft unterstützt:
- Es werden fälschlicherweise Compiler Fehler im Zusammengang mit «Functional Interfaces» und «Wildcard Types» angezeigt, beides sehr häufige Fälle im Kotlin Bytecode. Hier ein Beispiel eines entsprechenden Compiler Fehlers
- inige Compiler Fehler wurden von IntelliJ nicht erkannt, insbesondere beim Verwenden von selbst referenzierenden Parameter-Typen.
Take Aways – Kotlin Compiler-Plugin
Die Verwendung eines Compiler-Plugins zur Generierung von Code erachten wir als gute Option, auch wenn sich diese Möglichkeit in Bezug auf folgende Punkte immer noch in einem experimentellen Stadium zu befinden scheint:
- Es steht keine offizielle Dokumentation auf kotlinlang.org zur Verfügung
- Es stehen keine offiziellen Beispiel-Projekte mit aktuellen Abhängigkeiten zur Verfügung
- Der aktuelle de-facto Standard für Testing (https://github.com/tschuchortdev/kotlin-compile-testing) basiert noch auf Kotlin 1.9.24 (z.B. keine Unterstützung für Kotlin 2.x)
Beim Debuggen des Compiler-Plugins mussten wir aufgrund mangelnder Integration auf herkömmliche Debug-Ausgaben zurückgreifen. Wichtig zu wissen ist allerdings, dass Debug-Informationen, welche innerhalb eines Compiler-Plugins mittels println auf die Konsole ausgegeben werden, nur sichtbar werden, wenn in der entsprechenden Gradle-Konfiguration das Flag ‹kotlin.compiler.execution.strategy=in-process› gesetzt wird.
Wie weiter?
Da wir aktuell keinen direkten Bedarf für eine Java-API von Atrium sehen, werden die bisherigen Arbeiten nicht weitergeführt. Alle Änderungen sind jedoch auf einem Feature-Branch in Atrium publiziert und bilden eine gute Basis, sollte sich ein konkreter Bedarf ergeben.
Alle Änderungen dazu seht ihr hier:
https://github.com/robstoll/atrium/compare/main...feature/java-api