日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用ArchUnit验证代码和体系结构约束

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用ArchUnit验证代码和体系结构约束 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

ArchUnit是一個用于根據一組自定義代碼和體系結構約束檢查Java代碼的庫。 這些約束可以在單元測試中的流暢Java API中定義。 ArchUnit可用于驗證類或層之間的依賴關系,檢查循環依賴關系等等。 在本文中,我們將創建一些示例規則,以了解如何從ArchUnit中受益。

必需的依賴

要使用ArchUnit,我們需要在項目中添加以下依賴項:

< dependency > < groupId >com.tngtech.archunit</ groupId > < artifactId >archunit-junit5</ artifactId > < version >0.13.0</ version > < scope >test</ scope > </ dependency >

如果您仍在使用JUnit 4,則應改用archunit-junit4構件。

創建第一個ArchUnit規則

現在,我們可以開始創建第一個ArchUnit規則。 為此,我們在測試文件夾中創建一個新類:

@RunWith (ArchUnitRunner. class ) //only for JUnit 4, not needed with JUnit 5 @AnalyzeClasses (packages = "com.mscharhag.archunit" ) public class ArchUnitTest { // verify that classes whose name name ends with "Service" should be located in a "service" package @ArchTest private final ArchRule services_are_located_in_service_package = classes() .that().haveSimpleNameEndingWith( "Service" ) .should().resideInAPackage( "..service" ); }

通過@AnalyzeClasses,我們告訴ArchUnit應該分析哪些Java軟件包。 如果使用的是JUnit 4,則還需要添加ArchUnit JUnit運行器。

在類內部,我們創建一個字段并使用@ArchTest對其進行注釋。 這是我們的第一個測試。

我們可以使用ArchUnits流暢的Java API定義要驗證的約束。 在此示例中,我們要驗證所有名稱以Service結尾的類(例如UserService )都位于名為service (例如foo.bar.service )的包中。

大多數ArchUnit規則都以選擇器開頭,該選擇器指示應驗證哪種類型的代碼單元(類,方法,字段等)。 在這里,我們使用靜態方法classes()選擇類。 我們使用that()方法將選擇范圍限制為類的子集(這里我們僅選擇名稱以Service結尾的類)。 使用should()方法,我們可以定義與所選類匹配的約束(此處:這些類應位于服務包中)。

運行此測試類時,將執行所有帶有@ArchTest注釋的測試。 如果ArchUnits在服務包之外檢測到服務類,則測試將失敗。

更多例子

讓我們看一些更多的例子。

我們可以使用ArchUnit來確保所有Logger字段都是私有,靜態和最終的:

// verify that logger fields are private, static and final @ArchTest private final ArchRule loggers_should_be_private_static_final = fields() .that().haveRawType(Logger. class ) .should().bePrivate() .andShould().beStatic() .andShould().beFinal();

在這里,我們選擇Logger類型的字段,并在一個規則中定義多個約束。

或者,我們可以確保實用程序類中的方法必須是靜態的:

// methods in classes whose name ends with "Util" should be static @ArchTest static final ArchRule utility_methods_should_be_static = methods() .that().areDeclaredInClassesThat().haveSimpleNameEndingWith( "Util" ) .should().beStatic();

為了強制名為impl的軟件包不包含任何接口,我們可以使用以下規則:

// verify that interfaces are not located in implementation packages @ArchTest static final ArchRule interfaces_should_not_be_placed_in_impl_packages = noClasses() .that().resideInAPackage( "..impl.." ) .should().beInterfaces();

請注意,我們使用noClasses()而不是classes()來抵消should約束。

(我個人認為,如果我們可以將規則定義為interfaces()。should()。notResideInAPackage(“ .. impl ..”),則該規則將更容易閱讀。不幸的是,ArchUnit不提供interfaces()方法)

也許我們正在使用Java Persistence API并希望確保EntityManager僅在存儲庫類中使用:

@ArchTest static final ArchRule only_repositories_should_use_entityManager = noClasses() .that().resideOutsideOfPackage( "..repository" ) .should().dependOnClassesThat().areAssignableTo(EntityManager. class );

分層架構示例

ArchUnit還附帶了一些實用程序,用于驗證特定的體系結構樣式。

例如,我們可以使用layeredArchitecture()來驗證分層體系結構中各層的訪問規則:

@ArchTest static final ArchRule layer_dependencies_are_respected = layeredArchitecture() .layer( "Controllers" ).definedBy( "com.mscharhag.archunit.layers.controller.." ) .layer( "Services" ).definedBy( "com.mscharhag.archunit.layers.service.." ) .layer( "Repositories" ).definedBy( "com.mscharhag.archunit.layers.repository.." ) .whereLayer( "Controllers" ).mayNotBeAccessedByAnyLayer() .whereLayer( "Services" ).mayOnlyBeAccessedByLayers( "Controllers" ) .whereLayer( "Repositories" ).mayOnlyBeAccessedByLayers( "Services" );

在這里,我們定義了三層:控制器,服務和存儲庫。 存儲庫層只能由服務層訪問,而服務層只能由控制器訪問。

通用規則的快捷方式

為了避免我們必須自己定義所有規則,ArchUnit附帶了一組定義為靜態常量的通用規則。 如果這些規則符合我們的需求,我們可以簡單地將它們分配給測試中的@ArchTest字段。

例如,如果我們確保沒有拋出Exception和RuntimeException類型的異常,則可以使用預定義的NO_CLASSES_SHOULD_THROW_GENERIC_EXCEPTIONS規則:

@ArchTest private final ArchRule no_generic_exceptions = NO_CLASSES_SHOULD_THROW_GENERIC_EXCEPTIONS;

摘要

ArchUnit是一個強大的工具,可以根據一組自定義規則來驗證代碼庫。 常見的靜態代碼分析工具(例如FindBugs或SonarQube)也報告了我們看到的一些示例。 但是,這些工具通常很難根據您自己的項目特定規則進行擴展,這就是ArchUnit的用武之地。

與往常一樣,您可以從GitHub上的示例中找到Sources。 如果您對ArchUnit感興趣,還應該查看全面的用戶指南 。

翻譯自: https://www.javacodegeeks.com/2020/02/validating-code-and-architecture-constraints-with-archunit.html

總結

以上是生活随笔為你收集整理的使用ArchUnit验证代码和体系结构约束的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。