Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why isn't @DisplayName working for me in JUnit 5?

For some reason, I'm really having a hard time getting display names to actually be respected in JUnit 5 with Kotlin. Here's a test file I created for the purpose of example:

import org.assertj.core.api.Assertions
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test

@DisplayName("Example Test")
class ExampleTest {
    @Test
    @DisplayName("test name")
    fun myTest() {
        Assertions.assertThat(false).isTrue()
    }
}

But instead of these names being used, it's showing the actual class/method name as if they weren't annotated with @DisplayName at all. Here's the output from ./gradlew test:

project.path.ExampleTest > myTest() FAILED
    org.opentest4j.AssertionFailedError at ExampleTest.kt:12

25 tests completed, 1 failed

> Task :test FAILED

I keep thinking there must be something wrong with my Gradle configuration, but the setup is pretty simple so I don't know what I could be doing wrong. Here's my build.gradle.kts:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.3.60"
    id("org.jmailen.kotlinter") version "2.1.2"
    id("org.jetbrains.kotlin.plugin.serialization") version "1.3.60"
}

version = "0.1"

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0")
    testImplementation("org.junit.jupiter:junit-jupiter:5.5.2")
    testImplementation("org.assertj:assertj-core:3.14.0")
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

tasks.test {
    useJUnitPlatform()
}

Really scratching my head at this point, so any ideas would be appreciated. It's not using the names I give to my dynamic tests either (in conjunction with @TestFactory), which is particularly annoying.

like image 849
Ryan McLeod Avatar asked Nov 23 '19 20:11

Ryan McLeod


People also ask

Is JUnit 5 the same as JUnit Jupiter?

JUnit Jupiter is the combination of the programming model and extension model for writing tests and extensions in JUnit 5. The Jupiter sub-project provides a TestEngine for running Jupiter based tests on the platform.

What is @TAG in JUnit 5?

@Tag is a repeatable annotation that is used to declare a tag for the annotated test class or test method. Tags are used to filter which tests are executed for a given test plan.

Is JUnit 5 backwards compatible with JUnit 4?

Please note that JUnit 5 is not backward compatible with JUnit 4, but the JUnit team created the JUnit Vintage Project to support JUnit 4 test cases on top of JUnit 5.

How do I switch from junit4 to junit5?

To convert an existing JUnit 4 test to JUnit 5, use the following steps, which should work for most tests: Update imports to remove JUnit 4 and add JUnit 5. For instance, update the package name for the @Test annotation, and update both the package and class name for assertions (from Asserts to Assertions ).


2 Answers

Finally figured this out. It was an IntelliJ configuration issue. (The display names are never displayed in the command line anyway apparently.)

Turns out I had it configured to use the Gradle test runner instead of the IntelliJ one, which doesn't show custom display names. The solution was to go into IntelliJ settings -> Build, Execution, Deployment -> Gradle and under "Run tests using" select "IntelliJ IDEA"

Thanks go to JBNizet for pointing out that display names are supposed to show up in the HTML test report that Gradle generates but not in the command line, which helped me determine that this was an IntelliJ-specific issue.

like image 136
Ryan McLeod Avatar answered Sep 17 '22 15:09

Ryan McLeod


It's because IntelliJ uses gradle test runner by default and it does not allow custom display name.

The solution is really simple you just need to change the default test runner from "Gradle" to "IntelliJ Idea".

  • Preferences
  • Build, Execution, Deployment
  • Build Tools
  • Gradle
  • Run tests using = IntelliJ Idea

How to change default test runner in IntelliJ Idea

like image 21
Pallaw Avatar answered Sep 18 '22 15:09

Pallaw