55212
Scalaで書かれたアプリケーションに対して、アーキテクチャをきれいに保ちたいと考えています。  
そこで、複数のクラスの間での依存関係をアーキテクチャ上のレイヤごとに制約して、  
ビルド時にこれを違反する場合には検出出来るようにしたいと思っています。

JavaではJDependという、クラス間依存関係に対するテストを書くためのツールがあります。  
実際にアーキテクチャをシンプルに保つために使われているようです。

JDependはJavaVM向けに作られたソフトウェアのようなので  
おそらくScalaでも上手くやればsbt設定などから  
使えるのではないかと思うのですが、そういったドキュメントを見かけません。

Scalaでも似たようなことはできないでしょうか。  
またはJDependをScalaでも利用できないでしょうか。  
設定方法やツールを教えていただきたいです。

(他の情報として、もしかしたら <https://stackoverflow.com/questions/8732370/how-to-detect-
dependencies-on-java-classes-in-scala-sources>
が全く同じ質問のようにも思うのですが、情けないことに英語を正確な形で理解することが出来ないでいます。)
CC BY-SA 4.0
2018-11-08T11:43:00.733
50099
2019-05-24T01:41:49.303
2018-11-08T11:52:42.577
30827
30827
question
scala テスト アーキテクチャ
Scalaアプリに対して、クラスの依存関係をテストする方法を教えてください
自分では試してないんですが、これで出来そうじゃないですか？  
<https://contributors.scala-lang.org/t/sculpt-dependency-graph-extraction-for-
scala/1507>
CC BY-SA 4.0
2018-12-04T00:46:06.207
50882
2018-12-04T00:46:06.207
12620
50099
answer
自己解決したので記録します。

このような用途でScalaに対して使えるフレームワークとしてArchUnitがあります。  
<https://www.archunit.org/>

ArchUnitは基本的にはJava向けに作られていますが、ScalaやKotlinでも利用可能です。  
特にScalaに適用する場合、適当なテストフレームワーク(以下のサンプルではscalatest)の中で呼び出して使う形になります。

```

    package com.example.archunit
    
    import org.scalatest._
    
    import com.tngtech.archunit.core.domain.JavaClasses
    import com.tngtech.archunit.core.importer.ClassFileImporter
    import com.tngtech.archunit.lang.ArchRule
    import com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes
    
    
    /** アーキテクチャについてのテスト(適応度関数)
     */
    class ArchTest extends FlatSpec with Matchers {
      private val packageClasses: JavaClasses = new ClassFileImporter().importPackages(
        // 自分自身のパッケージのクラスを検査対象にする
        "com.example.archunit",
        // 他にも依存しているパッケージを記述してよい
      )
    
      it should "各モジュールはルートパッケージに依存していない" in {
        val rule = classes()
          .that()
          .resideInAPackage(".")
          .should()
          .onlyHaveDependentClassesThat()
          .resideInAPackage(".")
        rule.check(packageClasses)
      }
    }
    
```

とすると、(依存関係等の)アーキテクチャ自体についての検査をScalaでも実現できます。  
メソッドチェイン内の内容については、公式の最新サンプル等を参照にするとよいでしょう。
CC BY-SA 4.0
2019-05-24T01:33:02.700
55212
2019-05-24T01:41:49.303
2019-05-24T01:41:49.303
30827
30827
50099
answer