介绍
很多次我们开始一个项目时,我们遇到的最大困难是在组织包裹,班级和定义时,哪个班级可以访问其他班级,在击败这个困难之后,我们的下一个挑战是维护该组织以及未来开发人员甚至我们的文档,我们如何定义项目的体系结构,这就是您接下来会看到的!
为什么要建筑测试?
如前所述,除了更多地组织我们的项目并定义公约外,我们设法以一种非常友好的方式进行了文档,如下所示,我们看到了一条规则,告知了 ementity的课程强>应该居住:
@ArchTest
static final ArchRule entities_must_reside_in_a_domain_package =
classes().that().areAnnotatedWith(Entity.class).should().resideInAPackage("..domain..")
.as("Entities must reside in the domain package");
但是我们现在如何实践呢? :)
我们将使用什么技术?
对于本文,我们需要在我们的项目中拥有以下技术:
我不会使用太多使用的技术,因为这不是我们本文的目的。
设置我们的项目:
为了使我们在项目中使用 Archunit ,我们需要添加以下依赖性:
<dependency>
<groupId>com.tngtech.archunit</groupId>
<artifactId>archunit-junit5</artifactId>
<version>0.18.0</version>
<scope>test</scope>
</dependency>
之后,我们将在我们的测试软件包中创建一个称为
@AnalyzeClasses(
packages = "YourPackage",
importOptions = ImportOption.DoNotIncludeTests.class
)
public class ArchitectureTest {
}
注意:在上面的示例中,插入了一个选项,以使测试不包括在我们的验证中,但是如果您也想以测试的名义定义模式,请感觉自由。 :)
现在,让我们开始感兴趣! = d
一起,我们将定义一个简单的体系结构,其中我们将拥有 Controller 类,该类只能调用服务类,并且只能调用<<强>存储库类,如下图所示:
之后,我们将定义每个班级的名称的外观,最后,它将居住在什么包中,也就是说,让我们创建我们的体系结构? :)
定义我们的班级名称:
在第一步中,我们将定义班级的名称,因为我们是极具创造力的人,我们将使用班级结束时每个注释的名称,为什么没有人想到以前? :D
@ArchTest
static ArchRule ClassesThatHaveControllerAnnotation_MustEndWithControllerName =
classes()
.that().areAnnotatedWith(Controller.class)
.should().haveSimpleNameEndingWith("Controller")
.as("Dear developer, all our classes that are annotated as Controller, must have the name finalized with Controller");
如上所述,使用 Archunit 测试非常简单且非常直观,在我们的测试中,我们告知每个被注释为 Controller 的班级都必须具有名称最终确定为 * Controller *,此外,我们为下一个不按计划的方式提供了一个小费,使用“ .AS(....)”,ISN那太酷了吗? :)
i强迫错误,将我们的班级名称更改为用户约翰,看看发生了什么事:
之后,我们只是为其他类创建规则,但这是您尝试的:)
如果不能,请不要担心,只需打开项目的GitHub:)
定义我们班级的住所:
在第二步中,我们将定义每个类将居住的位置,测试将与上一类非常相似,所以我们去吗? :)
@ArchTest
static ArchRule ClassesThatHaveControllerAnnotation_MustResideInTheControllerPackage =
classes()
.that().areAnnotatedWith(Controller.class)
.should().resideInAPackage("..controller..")
.as("Dear developer, all our classes that are annotated as Controller, must reside in the *.controller package");
在上面的示例中,我们告知“ .ResideInaCkage(...)”,这将是我们班级实际居住的地方。
定义哪个课程将调用哪个类:
最后,要得出结论,我们需要定义哪个类别的挑战,这样我们就可以控制哪个班级能够知道对方,因为我们将遵循下面的示例:
@ArchTest
static final ArchRule ClassesResidingInControllerPackageCannotKnowRepository =
noClasses().that().resideInAPackage("..controller..")
.should().dependOnClassesThat().resideInAPackage("..repository..")
.as("Repository classes cannot be together with Controller classes :(");
在上面的示例中,我们定义了 Controller 软件包中的任何类都可以取决于存储库中的任何类,不是吗? :D
谢谢大家= D
我感谢所有阅读我的文章并陪伴我创建内容的人:)
ArchUnit,拥有出色的文档,在我日常运行的项目中有很多帮助,您如何看待在项目中介绍这一点? :)