jgiven-kotlin

March 31, 2025 ยท View on GitHub

Extensions that make working with the JVM BDD testing tool JGiven and Kotlin even more fun.

stable Build Status sponsored Maven Central FOSSA Status

Usage

Maven

<dependency>
  <groupId>io.toolisticon.testing</groupId>
  <artifactId>jgiven-kotlin</artifactId>
  <version>2.0.2.0</version>
  <scope>test</scope>  
</dependency>

Features

GIVEN,WHEN,THEN

when using kotlin, instead of

given()
  .some_facts()

`when`()  // when is a keyword in kotlin
  .something_happens()

then()
  .expect_a_result()

you can simply use the dynamic extension properties:

GIVEN
  .some_facts();

WHEN
  .something_happens()

THEN
  .expect_a_result()

(written in CAPS to avoid keyword conflicts).

Implementing Stages

In jgiven-java, you have to do:

class MyStage extends Stage<MyStage> {

  MyStage my_step() {
    // what the step does
    return self();
  }
}

jgiven-kotlin introduces the inline extension function step(), so this can be simplified to:

@JGivenKotlinStage
class MyStage : Stage<MyStage>() {

  fun `my step`() = step {
    // what the step does
  }
}

JGivenKotlinStage annotation

Since all classes and functions are final by default in kotlin, you have to explicitly mark everything you write in a Stage to be open.

Using the JGivenKotlinStage annotation and kotlin's "all-open" compiler plugin, this can be avoided.

Gradle

plugins {
  id("org.jetbrains.kotlin.plugin.allopen") version "${kotlin_version}"
}

//...

allOpen {
  annotation("io.toolisticon.testing.jgiven.JGivenKotlinStage")
}

Maven


<plugin>
  <!-- Kotlin compiler -->
  <artifactId>kotlin-maven-plugin</artifactId>
  <groupId>org.jetbrains.kotlin</groupId>
  <configuration>
    <compilerPlugins>
      <plugin>all-open</plugin>
    </compilerPlugins>
    <pluginOptions>
      <option>all-open:annotation=io.toolisticon.testing.jgiven.JGivenKotlinStage</option>
    </pluginOptions>
  </configuration>
  <!-- ... -->
  <dependencies>
    <dependency>
      <groupId>org.jetbrains.kotlin</groupId>
      <artifactId>kotlin-maven-allopen</artifactId>
      <version>${kotlin.version}</version>
    </dependency>
  </dependencies>
</plugin>

Notes

License

FOSSA Status