Kotlin Project への KotlinTest の追加に失敗
Tags: kotlin, kotlintest, junit
Published: 2022-07-10 14:01:04



## why

Should を使ってネストされたわかりやすい Kotlin のテストを作りたかった。既に Ktor アプリで Hello World はしていたので、それに追加を試みてみた。

---

## KotlinTest と Behavour 駆動開発

https://qiita.com/rkowase/items/b612e18caa3d5aca5043

rkowase さんの記事によると

kotlinTest という外部ライブラリを使うと
should というわかりやすい名前のテストを使えるらしい。

https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%98%E3%82%A4%E3%83%93%E3%82%A2%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA

すると、TDD を BDD にして、
テストが仕様書の役割まで兼ねる読みやすいものになるらしい。

---

## 結論

結論、既に動いている Ktor アプリに KotlinTest を追加するのは無理だった。

なので、新しく KotlinTest の依存関係の Junit5 を組み込んで　Ktor アプリを作ることにする。

---

# KotlinTest を Ktor アプリに追加

## build.grandle.kts の dependencies の testImplementation に kotlin("test") を追加

https://kotlinlang.org/docs/jvm-test-using-junit.html#add-the-code-to-test-it

Kotlin の公式 docs を参考にする。

build.grandle.kts が Node.js の pack.json だと解釈する。

npm install の同等なものは見つからなかったので

```js
dependencies {
    // Other dependencies.
    testImplementation(kotlin("test"))
}
```

dependencies に testImplementation で
kotlin("test") を入れて追加する。

こうやって依存関係を設定ファイルにいれて
再度ビルドすればインストールが走ると仮定する。

```js
tasks.test {
    useJUnitPlatform()
}
```

task.test という新しい実行を作って、
て useJUnitPlatform を入れる。

---

## ビルドしなおす

再度ビルドする。すると

```php
Execution failed for task ':compileTestKotlin'.
> Error while evaluating property 'filteredArgumentsMap' of task ':compileTestKotlin'
   > Could not resolve all files for configuration ':testCompileClasspath'.
         > Module 'org.jetbrains.kotlin:kotlin-test-junit' has been rejected:
              Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.7.0' also provided by [org.jetbrains.kotlin:kotlin-test-junit5:1.7.0(junit5Api)]

```

すると、TestKotlin の実行に失敗する。

Junit 5.1.7 がないとのエラーがでている。

https://kotlinlang.org/docs/jvm-test-using-junit.html#add-dependencies

公式のページをみると、最初にプロジェクトを生成する時に
Junit5 を含んで生成するように描いてあった。

---

## Project Structure から 

GUI でいく

https://stackoverflow.com/a/19330833

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8gtehrucr982p4wl9g3f.png)
 
main / test のフォルダで右クリックすると

Open Module Settings のページがでてくる。

Project Structure / Project Settings /
Modules / Dependenices / 

ここまで開く。

ここで Project Settings / に戻って 
Library を開き、青い + ボタンを押す。
開いたモーダルで From Maven を選択する。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hcznumcr0c9dfzffm5my.png)

すると Web から検索して DL できるモーダルが開く。
ここで junit5 と入力して虫眼鏡ボタンを押すと

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2qacrob2m83lxjxoxbn.png)

- com.automation-remarks の junit 5.1.{6,7}
- com.bnorm の junit 0.1.{0,1}
- com.flowloginx.org の junit の
  - contianer, core, parent, 

エラーメッセージに必要だとでてきた 5.1.**7** を入れる。

Transitive depend のみ

ktor の本体に追加

source / ktor / lib / に入った。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ohmdqgm62twck51epble.png)

Module で読めるようになる。 
Export を Apply する。

しかしこれでもエラーがかわらなかった。

```kotlin
Execution failed for task ':compileTestKotlin'.
> Error while evaluating property 'filteredArgumentsMap' of task ':compileTestKotlin'
   > Could not resolve all files for configuration ':testCompileClasspath'.
      > Could not resolve org.jetbrains.kotlin:kotlin-test-junit:1.7.0.
        Required by:
            project :
         > Module 'org.jetbrains.kotlin:kotlin-test-junit' has been rejected:
              Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.7.0' also provided by [org.jetbrains.kotlin:kotlin-test-junit5:1.7.0(junit5Api)]
      > Could not resolve org.jetbrains.kotlin:kotlin-test-junit5:1.7.0.
        Required by:
            project : > org.jetbrains.kotlin:kotlin-test:1.7.0
```

もともと ビルドシステムを Maven ではなく IntelliJ で作っていたからかもしれない。

Junit 込で最初から作り直す。