{"id":16704,"date":"2021-04-15T23:53:29","date_gmt":"2021-04-15T21:53:29","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=16704"},"modified":"2021-04-17T09:05:06","modified_gmt":"2021-04-17T07:05:06","slug":"archunit","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=16704","title":{"rendered":"ArchUnit gestern in Version 0.18.0 ver\u00f6ffentlicht oder wie validiere ich die Architektur am Beispiel einer Blockchain"},"content":{"rendered":"<p>Gestern wurde <a href=\"https:\/\/github.com\/TNG\/ArchUnit\/releases\/tag\/v0.18.0\" rel=\"noopener\" target=\"_blank\">ArchUnit<\/a> in Version 0.18.0 ver\u00f6ffentlicht.<br \/>\n<figure id=\"attachment_16709\" aria-describedby=\"caption-attachment-16709\" style=\"width: 2560px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1919\" class=\"size-full wp-image-16709\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/ArchUnit-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><figcaption id=\"caption-attachment-16709\" class=\"wp-caption-text\">ArchUnit<\/figcaption><\/figure><br \/>\nWenn das keine Grund ist mal zu zeigen, wie man eine Package-Abh\u00e4ngigkeit \u00fcberpr\u00fcfen kann.<br \/>\nAlso wir wollen einen Test schreiben, der durchl\u00e4uft wenn nur aus dem Package <strong>blockchain<\/strong> auf das Package <strong>be<\/strong> zugegriffen wird. Wie hier im UML Diagramm gezeigt:&#8230;<!--more--><\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/architektur-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/architektur-1.png\" alt=\"\" width=\"1176\" height=\"638\" class=\"aligncenter size-full wp-image-16716\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/architektur-1.png 1176w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/architektur-1-300x163.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/architektur-1-1024x556.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/04\/architektur-1-768x417.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Umgekehrt soll der Testfall fehlschlagen. In Junit 5 geht das mit einem 2 Zeiler. Hier die ganze Testklasse:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.blockchain;\r\n\r\nimport com.tngtech.archunit.junit.AnalyzeClasses;\r\nimport com.tngtech.archunit.junit.ArchTest;\r\nimport com.tngtech.archunit.lang.ArchRule;\r\n\r\n\/\/ static Import n\u00f6tig:\r\nimport static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;\r\n\r\n\/**\r\n * Architektur vorgaben.\r\n * \r\n * Siehe https:\/\/www.archunit.org\/userguide\/html\/000_Index.html\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\n@AnalyzeClasses(packages = \"de.wenzlaff.blockchain\") \/\/ Annotation des Package\r\npublic class ArchitekturPackageTest {\r\n\r\n\t\/**\r\n\t * Das be Package darf nicht auf das Blockchain Package zugreifen. Nur\r\n\t * umgekehrt.\r\n\t *\/\r\n\t@ArchTest \/\/ n\u00f6tige Annotation mit Regel\r\n\tpublic static final ArchRule Package_BE_Rule = noClasses().that().resideInAPackage(\"..be..\").should().dependOnClassesThat()\r\n\t\t\t.resideInAPackage(\"..blockchain..\");\r\n}<\/pre>\n<p>Interessant ist auch, wie das UML zeigt, das die ArchUnit Validierung <strong>keine<\/strong> statischen Abh\u00e4ngigkeiten zu den beiden Packages hat. Das l\u00e4uft alles \u00fcber Reflections und Classpath-Scann.<\/p>\n<p>Nat\u00fcrlich brauchen wir noch <a href=\"https:\/\/www.archunit.org\/userguide\/html\/000_Index.html\" rel=\"noopener\" target=\"_blank\">ArchUnit<\/a> in der pom.xml, aber nur mit Test Scope:<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;com.tngtech.archunit&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;archunit-junit5&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;0.18.0&lt;\/version&gt;\r\n\t\t\t&lt;scope&gt;test&lt;\/scope&gt;\r\n\t\t&lt;\/dependency&gt;\r\n<\/pre>\n<p>Das ganze Blockchain Beispiel-Projekt gibt es <a href=\"https:\/\/gitlab.com\/IT-Berater\/twblockchain\" rel=\"noopener\" target=\"_blank\">hier<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gestern wurde ArchUnit in Version 0.18.0 ver\u00f6ffentlicht. Wenn das keine Grund ist mal zu zeigen, wie man eine Package-Abh\u00e4ngigkeit \u00fcberpr\u00fcfen kann. Also wir wollen einen Test schreiben, der durchl\u00e4uft wenn nur aus dem Package blockchain auf das Package be zugegriffen wird. Wie hier im UML Diagramm gezeigt:&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,3897,5,2953,3163,79,1319,2658],"tags":[107,4843,1183,3496,4611,2571,194,1709,4844],"class_list":["post-16704","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java-programmierung","category-java","category-junit-5","category-maven","category-programmierung","category-sicherheit-2","category-test-thema","tag-architektur","tag-archunit","tag-bitcoin","tag-blockchain","tag-btc","tag-checken","tag-test-2","tag-testen","tag-ueberpfruefen"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/16704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16704"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/16704\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16704"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}