ArchUnit 연습: StringUtil(s) 너무 많은 문제에 지지 않는다

// 実行環境
* AdoptOpenJDK 11.0.9.1+1
* JUnit 5.7.0
* ArchUnit 0.14.1

아키텍처 테스트 동기 부여



프레임워크나 복수의 라이브러리를 도입하면(자), 각각으로 독자적으로 구현된 StringUtil(s) 클래스가 코드 보완에 복수로 오고 어느 것을 사용하면 좋은가 곤란하다, 라고 하는 것은 자주 있습니다.

개발자에 의해 사용하는 StringUtil(s) 클래스가 달라지면, 일관성이 없는, 예상외의 의존을 포함한 코드가 되어 버립니다.



예를 들어, "StringUtil(s) 는 org.apache.commons.lang3.StringUtils 를 사용한다"는 것이 프로젝트의 가이드라인으로 정해져 있다면, 그것을 아키텍처 테스트에 의해 담보할 수 있습니다.

아키텍처 테스트 구현


package com.example;
 
import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import org.junit.jupiter.api.Test;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;

class ArchitectureTest {

    // 検査対象のクラス
    private static final JavaClasses CLASSES =
            new ClassFileImporter()
                    .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
                    .importPackages("com.example");

    @Test
    void StringUtilsはApacheCommonsLang3のStringUtilsのみ使用可能() {
        classes()
            .should()
            .onlyDependOnClassesThat(new DescribedPredicate<>("org.apache.commons.lang3 の StringUtils クラス") {
                /**
                 * @param clazz 依存先のクラス
                 * @return 依存先のクラスが org.apache.commons.lang3.StringUtils である場合、true
                 */
                @Override
                public boolean apply(final JavaClass clazz) {
                    boolean isStringUtil = clazz.getSimpleName().endsWith("StringUtils")
                        || clazz.getSimpleName().endsWith("StringUtil");

                    if (! isStringUtil) {
                        // StringUtil(s) でないクラスは、このテストでの依存チェック対象外
                        return true;
                    }

                    return clazz.getPackageName().equals("org.apache.commons.lang3");
                }
            })
            .check(CLASSES);
    }
}

좋은 웹페이지 즐겨찾기