JUnit5とSpockを同じプロジェクトで使う

JUnit5の環境でSpockを使いたいときのメモ。

追記
Spock 2.0からはJUnit5で動作するので、JUnit4の設定は不要。
https://spockframework.org/spock/docs/2.0/release_notes.html

ソースコード

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'groovy'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
    testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5'
    testImplementation 'org.spockframework:spock-spring:1.3-groovy-2.5'
    testImplementation 'org.codehaus.groovy:groovy-all:2.5.14'
}

test {
    useJUnitPlatform()
    testLogging {
        showStandardStreams = true
    }
}

HelloController.java

@RestController
public class HelloController {
    @GetMapping("/hello")
    public Map<String, String> hello() {
        return Map.of("message", "Hello!");
    }
}

HelloControllerTest.groovy

@WebMvcTest(controllers = HelloController.class)
class HelloControllerTest extends Specification {
    @Autowired
    MockMvc mvc

    def "hello"() {
        expect:
        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().json("""
                    {
                        "message":"Hello!"
                    }
               """))
    }
}

参考