Lazy variable evaluation for test in Kotlin (inspired by Given2)
Step 1. Add the JitPack repository to your build file
allprojects {
repositories {
...
maven("https://jitpack.io")
}
}
Step2. Add the dependency
dependencies {
implementation("com.github.JIY0UNG:givenK:1.0.0")
}
class Student(
val name: String,
val score: Int,
val subject: String,
)
fun grade(
student: Student,
): String = if (student.score in 50..100) "PASS" else "FAIL"
class ExampleTest {
var score by Given { 100 }
var student by Given {
Student(
name = "John Doe",
score = score,
subject = "algorithm",
)
}
@Test
@DisplayName("Grade should be PASS when score is 100")
fun test1() {
score = 100
assertEquals("PASS", grade(student))
}
@Test
@DisplayName("Grade should be PASS when score is 70")
fun test2() {
score = 70
assertEquals("PASS", grade(student))
}
@Test
@DisplayName("Grade should be FAIL when score is 40")
fun test3() {
score = 40
assertEquals("FAIL", grade(student))
}
}
If you use givenK with Nested annotation in JUnit 5 or DescribeSpec in Kotest, you can see the changed values more clearly.
// Using Nested annotation in JUnit 5
@Nested
@DisplayName("Describe Grade")
inner class Describe {
@Nested
@DisplayName("When score is 100")
inner class Context1 {
@BeforeEach
fun setUp() {
score = 100
}
@Test
@DisplayName("It should be PASS")
fun test() {
assertEquals("PASS", grade(student))
}
}
@Nested
@DisplayName("When score is 40")
inner class Context2 {
@BeforeEach
fun setUp() {
score = 40
}
@Test
@DisplayName("It should be FAIL")
fun test() {
assertEquals("FAIL", grade(student))
}
}
}
// Using DescribeSpec in Kotest
init {
describe("Describe Grade") {
context("When score is 100") {
beforeEach { score = 100 }
it("It should be PASS") {
grade(student) shouldBe "PASS"
}
}
context("When score is 40") {
beforeEach { score = 40 }
it("It should be FAIL") {
grade(student) shouldBe "FAIL"
}
}
}
}