62354
# Spring BootにおけるJUnitがUnresolvedになる。

## 概要

現在、Kotlin + SpringBootを参考書を使用して入門中です。  
  
そこで、参考書通りにJUnitを使用したテストコードを書き、`% gradle
test`を実行したところ下記のようなエラーが発生しました。ライブラリが正常にインポートされていないのは理解できています…。  
  
自分なりに色々調べてみましたが解決せず…。  
  
どなたか解決方法のご教授お願いいたします。

## エラー内容

```

    > Task :compileTestKotlin FAILED
    e: /Users/kondohiroki/IdeaProjects/demo_db/src/test/kotlin/com/example/hello_db_app/demo_db/ControllerTests.kt: (6, 18): Unresolved reference: Before
    e: /Users/kondohiroki/IdeaProjects/demo_db/src/test/kotlin/com/example/hello_db_app/demo_db/ControllerTests.kt: (7, 18): Unresolved reference: Test
    e: /Users/kondohiroki/IdeaProjects/demo_db/src/test/kotlin/com/example/hello_db_app/demo_db/ControllerTests.kt: (8, 30): Unresolved reference: Before
    e: /Users/kondohiroki/IdeaProjects/demo_db/src/test/kotlin/com/example/hello_db_app/demo_db/ControllerTests.kt: (10, 18): Unresolved reference: runner
    e: /Users/kondohiroki/IdeaProjects/demo_db/src/test/kotlin/com/example/hello_db_app/demo_db/ControllerTests.kt: (21, 2): Unresolved reference: RunWith
    e: /Users/kondohiroki/IdeaProjects/demo_db/src/test/kotlin/com/example/hello_db_app/demo_db/ControllerTests.kt: (30, 6): Unresolved reference: BeforeEach
    
    
```

## 該当のソースコード

```

    // ControllerTests.kt
    
    package com.example.hello_db_app.demo_db.controllers
    
    import com.example.hello_db_app.demo_db.MainController
    import com.example.hello_db_app.demo_db.User
    import org.aspectj.lang.annotation.Before
    import org.junit.Before
    import org.junit.Test
    import org.junit.jupiter.api.Before
    import org.junit.jupiter.api.Test
    import org.junit.runner.RunWith
    import org.springframework.beans.factory.annotation.Autowired
    import org.springframework.boot.test.context.SpringBootTest
    import org.springframework.http.MediaType
    import org.springframework.test.context.jdbc.Sql
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner
    import org.springframework.test.web.servlet.MockMvc
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers.*
    import org.springframework.test.web.servlet.setup.MockMvcBuilders
    
    @RunWith(SpringJUnit4ClassRunner::class)
    @SpringBootTest
    class ControllerTests {
    
    　　　　テスト処理...略
    
    }
    
```

```

    // build.gradle.kts
    
    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    plugins {
        id("org.springframework.boot") version "2.2.2.RELEASE"
        id("io.spring.dependency-management") version "1.0.8.RELEASE"
        kotlin("jvm") version "1.3.61"
        kotlin("plugin.spring") version "1.3.61"
        kotlin("plugin.jpa") version "1.3.61"
    }
    
    group = "com.example.hello_db_app"
    version = "0.0.1-SNAPSHOT"
    java.sourceCompatibility = JavaVersion.VERSION_1_8
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation("org.springframework.boot:spring-boot-starter-data-jpa")
        implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
        implementation("org.springframework.boot:spring-boot-starter-web")
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        runtimeOnly("com.h2database:h2")
        testImplementation("org.springframework.boot:spring-boot-starter-test") {
            exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
        }
    }
    
    tasks.withType<Test> {
        useJUnitPlatform()
    }
    
    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs = listOf("-Xjsr305=strict")
            jvmTarget = "1.8"
        }
    }
    
    
```
CC BY-SA 4.0
2020-01-18T09:15:04.817
62348
2020-01-18T14:44:18.157
32711
question
java spring-boot kotlin gradle
Spring BootにおけるJUnitがUnresolvedになる。
```

    import org.aspectj.lang.annotation.Before
    import org.junit.Before
    import org.junit.Test
    import org.junit.jupiter.api.Before
    import org.junit.jupiter.api.Test
    
```

同名のクラスをimportし過ぎですね。例えば、以下のようにどれか1つにして下さい。

```

    import org.junit.Before
    import org.junit.Test
    
```

それから、`build.gradle.kts`を見ると、（`'junit-vintage-engine'`）をexclude（除外）しているので、JUnit
5ベースのテストケースは正常に動作しますが、JUnit 4ベースのテストケースは動作しないようです。

```

    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    }
    
```

一方、テストクラスのアノテーションはJUnit 4のもののようです。

```

    @RunWith(SpringJUnit4ClassRunner::class)
    
```

これから新規にアプリケーションを作成するのであれば、どちらかのバージョンに統一した方がいいと思います。

参考書を見ながら入門中ということのようですので、その参考書と同じバージョンを使用した方が無難かもしれません。

参考：  
<https://www.javacodemonk.com/migrating-spring-boot-tests-from-junit-4-to-
junit-5-00aa2839>
CC BY-SA 4.0
2020-01-18T13:50:47.060
62354
2020-01-18T14:44:18.157
2020-01-18T14:44:18.157
21092
21092
62348
answer