diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.0-M2.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.0-M2.adoc
index 412165b0c8da..291775e214ed 100644
--- a/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.0-M2.adoc
+++ b/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.0-M2.adoc
@@ -22,7 +22,7 @@ repository on GitHub.
==== Deprecations and Breaking Changes
* Discontinue `junit-platform-suite-commons` which is now integrated into
- `junit-platform-suite`
+ `junit-platform-suite`.
[[release-notes-6.0.0-M2-junit-platform-new-features-and-improvements]]
==== New Features and Improvements
@@ -47,7 +47,8 @@ repository on GitHub.
[[release-notes-6.0.0-M2-junit-jupiter-new-features-and-improvements]]
==== New Features and Improvements
-* ❓
+* Reason strings supplied to `ConditionEvaluationResult` APIs are now officially declared
+ as `@Nullable`.
[[release-notes-6.0.0-M2-junit-vintage]]
diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ConditionEvaluationResult.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ConditionEvaluationResult.java
index 4cbf960d1ddd..c4de9b5bcd84 100644
--- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ConditionEvaluationResult.java
+++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ConditionEvaluationResult.java
@@ -15,6 +15,7 @@
import java.util.Optional;
import org.apiguardian.api.API;
+import org.jspecify.annotations.Nullable;
import org.junit.platform.commons.util.StringUtils;
import org.junit.platform.commons.util.ToStringBuilder;
@@ -35,7 +36,7 @@ public class ConditionEvaluationResult {
* or an empty reason if the reason is unknown
* @see StringUtils#isBlank(String)
*/
- public static ConditionEvaluationResult enabled(String reason) {
+ public static ConditionEvaluationResult enabled(@Nullable String reason) {
return new ConditionEvaluationResult(true, reason);
}
@@ -48,7 +49,7 @@ public static ConditionEvaluationResult enabled(String reason) {
* or an empty reason if the reason is unknown
* @see StringUtils#isBlank(String)
*/
- public static ConditionEvaluationResult disabled(String reason) {
+ public static ConditionEvaluationResult disabled(@Nullable String reason) {
return new ConditionEvaluationResult(false, reason);
}
@@ -69,7 +70,8 @@ public static ConditionEvaluationResult disabled(String reason) {
* @see StringUtils#isBlank(String)
*/
@API(status = STABLE, since = "5.7")
- public static ConditionEvaluationResult disabled(String reason, String customReason) {
+ @SuppressWarnings("NullAway") // StringUtils.isBlank() does not yet have a nullability @Contract
+ public static ConditionEvaluationResult disabled(@Nullable String reason, @Nullable String customReason) {
if (StringUtils.isBlank(reason)) {
return disabled(customReason);
}
@@ -84,7 +86,7 @@ public static ConditionEvaluationResult disabled(String reason, String customRea
private final Optional reason;
@SuppressWarnings("NullAway") // StringUtils.isNotBlank() does not yet have a nullability @Contract
- private ConditionEvaluationResult(boolean enabled, String reason) {
+ private ConditionEvaluationResult(boolean enabled, @Nullable String reason) {
this.enabled = enabled;
this.reason = StringUtils.isNotBlank(reason) ? Optional.of(reason.strip()) : Optional.empty();
}
diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/api/condition/ConditionEvaluationResultTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/api/condition/ConditionEvaluationResultTests.java
index bb00488105b6..e82e5fa6df53 100644
--- a/jupiter-tests/src/test/java/org/junit/jupiter/api/condition/ConditionEvaluationResultTests.java
+++ b/jupiter-tests/src/test/java/org/junit/jupiter/api/condition/ConditionEvaluationResultTests.java
@@ -41,7 +41,6 @@ void enabledWithReason() {
@BlankReasonsTest
void enabledWithBlankReason(@Nullable String reason) {
- @SuppressWarnings("NullAway")
var result = ConditionEvaluationResult.enabled(reason);
assertThat(result.isDisabled()).isFalse();
@@ -62,7 +61,6 @@ void disabledWithDefaultReason() {
@BlankReasonsTest
void disabledWithBlankDefaultReason(@Nullable String reason) {
- @SuppressWarnings("NullAway")
var result = ConditionEvaluationResult.disabled(reason);
assertThat(result.isDisabled()).isTrue();
@@ -73,7 +71,6 @@ void disabledWithBlankDefaultReason(@Nullable String reason) {
@BlankReasonsTest
void disabledWithDefaultReasonAndBlankCustomReason(@Nullable String customReason) {
- @SuppressWarnings("NullAway")
var result = ConditionEvaluationResult.disabled("default", customReason);
assertThat(result.isDisabled()).isTrue();
@@ -84,7 +81,6 @@ void disabledWithDefaultReasonAndBlankCustomReason(@Nullable String customReason
@BlankReasonsTest
void disabledWithBlankDefaultReasonAndCustomReason(@Nullable String reason) {
- @SuppressWarnings("NullAway")
var result = ConditionEvaluationResult.disabled(reason, "custom");
assertThat(result.isDisabled()).isTrue();
@@ -95,7 +91,6 @@ void disabledWithBlankDefaultReasonAndCustomReason(@Nullable String reason) {
@BlankReasonsTest
void disabledWithBlankDefaultReasonAndBlankCustomReason(@Nullable String reason) {
// We intentionally use the reason as both the default and custom reason.
- @SuppressWarnings("NullAway")
var result = ConditionEvaluationResult.disabled(reason, reason);
assertThat(result.isDisabled()).isTrue();