diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 6eff8d3635b9..6851986eec5d 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -18,6 +18,7 @@ object Versions { val bartholdy = "0.2.3" val classgraph = "4.8.59" val commonsIo = "2.6" + val coroutines = "1.3.3" val groovy = "3.0.0-rc-2" val log4j = "2.12.1" val mockito = "3.2.4" diff --git a/dependencies/dependencies.gradle.kts b/dependencies/dependencies.gradle.kts index 4bde1418d98f..cdad73359f6a 100644 --- a/dependencies/dependencies.gradle.kts +++ b/dependencies/dependencies.gradle.kts @@ -25,5 +25,6 @@ dependencies { api("com.tngtech.archunit:archunit-junit5-api:${Versions.archunit}") api("com.tngtech.archunit:archunit-junit5-engine:${Versions.archunit}") api("org.slf4j:slf4j-jdk14:${Versions.slf4j}") + api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutines}") } } diff --git a/junit-jupiter-api/src/main/kotlin/org/junit/jupiter/api/Assertions.kt b/junit-jupiter-api/src/main/kotlin/org/junit/jupiter/api/Assertions.kt index 3008f79017b0..53c9a45c38f7 100644 --- a/junit-jupiter-api/src/main/kotlin/org/junit/jupiter/api/Assertions.kt +++ b/junit-jupiter-api/src/main/kotlin/org/junit/jupiter/api/Assertions.kt @@ -95,8 +95,11 @@ fun assertAll(heading: String?, vararg executables: () -> Unit) = * ``` * @see Assertions.assertThrows */ -inline fun assertThrows(noinline executable: () -> Unit): T = - Assertions.assertThrows(T::class.java, Executable(executable)) +inline fun assertThrows(executable: () -> Unit): T { + val result = runCatching(executable) + + return Assertions.assertThrows(T::class.java) { result.getOrThrow() } +} /** * Example usage: @@ -108,7 +111,7 @@ inline fun assertThrows(noinline executable: () -> Unit) * ``` * @see Assertions.assertThrows */ -inline fun assertThrows(message: String, noinline executable: () -> Unit): T = +inline fun assertThrows(message: String, executable: () -> Unit): T = assertThrows({ message }, executable) /** @@ -121,8 +124,11 @@ inline fun assertThrows(message: String, noinline execut * ``` * @see Assertions.assertThrows */ -inline fun assertThrows(noinline message: () -> String, noinline executable: () -> Unit): T = - Assertions.assertThrows(T::class.java, Executable(executable), Supplier(message)) +inline fun assertThrows(noinline message: () -> String, executable: () -> Unit): T { + val result = runCatching(executable) + + return Assertions.assertThrows(T::class.java, Executable { result.getOrThrow() }, Supplier(message)) +} /** * Example usage: diff --git a/junit-jupiter-engine/junit-jupiter-engine.gradle.kts b/junit-jupiter-engine/junit-jupiter-engine.gradle.kts index de44d724a1fe..776b048625b9 100644 --- a/junit-jupiter-engine/junit-jupiter-engine.gradle.kts +++ b/junit-jupiter-engine/junit-jupiter-engine.gradle.kts @@ -19,5 +19,6 @@ dependencies { testImplementation(project(":junit-platform-runner")) testImplementation(project(":junit-platform-testkit")) testImplementation("org.jetbrains.kotlin:kotlin-stdlib") + testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core") testImplementation("org.codehaus.groovy:groovy-all") } diff --git a/junit-jupiter-engine/src/test/kotlin/org/junit/jupiter/api/KotlinAssertionsTests.kt b/junit-jupiter-engine/src/test/kotlin/org/junit/jupiter/api/KotlinAssertionsTests.kt index 8b412d86bd7d..ab03031d1a09 100644 --- a/junit-jupiter-engine/src/test/kotlin/org/junit/jupiter/api/KotlinAssertionsTests.kt +++ b/junit-jupiter-engine/src/test/kotlin/org/junit/jupiter/api/KotlinAssertionsTests.kt @@ -11,6 +11,7 @@ package org.junit.jupiter.api import java.util.stream.Stream import kotlin.reflect.KClass +import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.AssertionTestUtils.assertMessageEquals import org.junit.jupiter.api.AssertionTestUtils.assertMessageStartsWith import org.junit.jupiter.api.AssertionTestUtils.expectAssertionFailedError @@ -60,6 +61,13 @@ class KotlinAssertionsTests { assertThrows({ "should fail" }) { fail(null as Throwable?) } } + @Test + fun `expected context exception testing`() = runBlocking { + assertThrows("Should fail async") { + suspend { fail("Should fail async") }() + } + } + @TestFactory fun assertDoesNotThrow(): Stream = Stream.of( dynamicContainer("succeeds when no exception thrown", Stream.of(