diff --git a/module/spring-boot-quartz/build.gradle b/module/spring-boot-quartz/build.gradle index 846135de853..581f817e0d1 100644 --- a/module/spring-boot-quartz/build.gradle +++ b/module/spring-boot-quartz/build.gradle @@ -47,3 +47,7 @@ dependencies { testRuntimeOnly("com.h2database:h2") testRuntimeOnly("com.zaxxer:HikariCP") } + +tasks.named("compileTestJava") { + options.nullability.checking = "tests" +} diff --git a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzAutoConfigurationTests.java b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzAutoConfigurationTests.java index e0288a2a5c0..33f5ef4141e 100644 --- a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzAutoConfigurationTests.java +++ b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzAutoConfigurationTests.java @@ -30,6 +30,7 @@ import java.util.concurrent.Executor; import javax.sql.DataSource; import org.awaitility.Awaitility; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.io.TempDir; @@ -630,14 +631,14 @@ class QuartzAutoConfigurationTests { @Autowired private Environment env; - private String jobDataKey; + private @Nullable String jobDataKey; @Override protected void executeInternal(JobExecutionContext context) { System.out.println(this.env.getProperty("test-name", "unknown") + " - " + this.jobDataKey); } - public void setJobDataKey(String jobDataKey) { + public void setJobDataKey(@Nullable String jobDataKey) { this.jobDataKey = jobDataKey; } diff --git a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointTests.java b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointTests.java index f0ad60c6e83..fe948cb1ce4 100644 --- a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointTests.java +++ b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointTests.java @@ -211,8 +211,12 @@ class QuartzEndpointTests { assertThat(summary.getGroup()).isEqualTo("DEFAULT"); Map jobSummaries = summary.getJobs(); assertThat(jobSummaries).containsOnlyKeys("jobOne", "jobTwo"); - assertThat(jobSummaries.get("jobOne").getClassName()).isEqualTo(Job.class.getName()); - assertThat(jobSummaries.get("jobTwo").getClassName()).isEqualTo(DelegatingJob.class.getName()); + QuartzJobSummaryDescriptor jobOne = jobSummaries.get("jobOne"); + assertThat(jobOne).isNotNull(); + assertThat(jobOne.getClassName()).isEqualTo(Job.class.getName()); + QuartzJobSummaryDescriptor jobTwo = jobSummaries.get("jobTwo"); + assertThat(jobTwo).isNotNull(); + assertThat(jobTwo.getClassName()).isEqualTo(DelegatingJob.class.getName()); } @Test @@ -246,6 +250,7 @@ class QuartzEndpointTests { .build(); mockTriggers(cronTrigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); assertThat(summary.getGroup()).isEqualTo("samples"); assertThat(summary.isPaused()).isFalse(); assertThat(summary.getTriggers().getCron()).containsOnlyKeys("3am-every-day"); @@ -269,6 +274,7 @@ class QuartzEndpointTests { ((OperableTrigger) cronTrigger).setNextFireTime(nextFireTime); mockTriggers(cronTrigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); Map triggers = summary.getTriggers().getCron(); assertThat(triggers).containsOnlyKeys("3am-every-day"); assertThat(triggers).extractingByKey("3am-every-day", nestedMap()) @@ -284,6 +290,7 @@ class QuartzEndpointTests { .build(); mockTriggers(simpleTrigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); assertThat(summary.getGroup()).isEqualTo("samples"); assertThat(summary.isPaused()).isFalse(); assertThat(summary.getTriggers().getCron()).isEmpty(); @@ -306,6 +313,7 @@ class QuartzEndpointTests { ((OperableTrigger) simpleTrigger).setNextFireTime(nextFireTime); mockTriggers(simpleTrigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); Map triggers = summary.getTriggers().getSimple(); assertThat(triggers).containsOnlyKeys("every-hour"); assertThat(triggers).extractingByKey("every-hour", nestedMap()) @@ -323,6 +331,7 @@ class QuartzEndpointTests { .build(); mockTriggers(trigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); assertThat(summary.getGroup()).isEqualTo("samples"); assertThat(summary.isPaused()).isFalse(); assertThat(summary.getTriggers().getCron()).isEmpty(); @@ -349,6 +358,7 @@ class QuartzEndpointTests { ((OperableTrigger) trigger).setNextFireTime(nextFireTime); mockTriggers(trigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); Map triggers = summary.getTriggers().getDailyTimeInterval(); assertThat(triggers).containsOnlyKeys("every-hour-tue-thu"); assertThat(triggers).extractingByKey("every-hour-tue-thu", nestedMap()) @@ -366,6 +376,7 @@ class QuartzEndpointTests { .build(); mockTriggers(trigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); assertThat(summary.getGroup()).isEqualTo("samples"); assertThat(summary.isPaused()).isFalse(); assertThat(summary.getTriggers().getCron()).isEmpty(); @@ -391,6 +402,7 @@ class QuartzEndpointTests { ((OperableTrigger) trigger).setNextFireTime(nextFireTime); mockTriggers(trigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); Map triggers = summary.getTriggers().getCalendarInterval(); assertThat(triggers).containsOnlyKeys("once-a-week"); assertThat(triggers).extractingByKey("once-a-week", nestedMap()) @@ -404,6 +416,7 @@ class QuartzEndpointTests { given(trigger.getKey()).willReturn(TriggerKey.triggerKey("custom", "samples")); mockTriggers(trigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); assertThat(summary.getGroup()).isEqualTo("samples"); assertThat(summary.isPaused()).isFalse(); assertThat(summary.getTriggers().getCron()).isEmpty(); @@ -424,6 +437,7 @@ class QuartzEndpointTests { given(trigger.getPriority()).willReturn(9); mockTriggers(trigger); QuartzTriggerGroupSummaryDescriptor summary = this.endpoint.quartzTriggerGroupSummary("samples"); + assertThat(summary).isNotNull(); Map triggers = summary.getTriggers().getCustom(); assertThat(triggers).containsOnlyKeys("custom"); assertThat(triggers).extractingByKey("custom", nestedMap()) @@ -644,6 +658,7 @@ class QuartzEndpointTests { .build(); mockJobs(job); QuartzJobDetailsDescriptor jobDetails = this.endpoint.quartzJob("samples", "hello", true); + assertThat(jobDetails).isNotNull(); assertThat(jobDetails.getGroup()).isEqualTo("samples"); assertThat(jobDetails.getName()).isEqualTo("hello"); assertThat(jobDetails.getDescription()).isEqualTo("A sample job"); @@ -672,6 +687,7 @@ class QuartzEndpointTests { given(this.scheduler.getTriggersOfJob(JobKey.jobKey("hello", "samples"))) .willAnswer((invocation) -> Collections.singletonList(trigger)); QuartzJobDetailsDescriptor jobDetails = this.endpoint.quartzJob("samples", "hello", true); + assertThat(jobDetails).isNotNull(); assertThat(jobDetails.getTriggers()).hasSize(1); Map triggerDetails = jobDetails.getTriggers().get(0); assertThat(triggerDetails).containsOnly(entry("group", "samples"), entry("name", "3am-every-day"), @@ -700,6 +716,7 @@ class QuartzEndpointTests { given(this.scheduler.getTriggersOfJob(JobKey.jobKey("hello", "samples"))) .willAnswer((invocation) -> Arrays.asList(triggerOne, triggerTwo)); QuartzJobDetailsDescriptor jobDetails = this.endpoint.quartzJob("samples", "hello", true); + assertThat(jobDetails).isNotNull(); assertThat(jobDetails.getTriggers()).hasSize(2); assertThat(jobDetails.getTriggers().get(0)).containsEntry("name", "two"); assertThat(jobDetails.getTriggers().get(1)).containsEntry("name", "one"); @@ -726,6 +743,7 @@ class QuartzEndpointTests { given(this.scheduler.getTriggersOfJob(JobKey.jobKey("hello", "samples"))) .willAnswer((invocation) -> Arrays.asList(triggerOne, triggerTwo)); QuartzJobDetailsDescriptor jobDetails = this.endpoint.quartzJob("samples", "hello", true); + assertThat(jobDetails).isNotNull(); assertThat(jobDetails.getTriggers()).hasSize(2); assertThat(jobDetails.getTriggers().get(0)).containsEntry("name", "two"); assertThat(jobDetails.getTriggers().get(1)).containsEntry("name", "one"); @@ -741,6 +759,7 @@ class QuartzEndpointTests { .build(); mockJobs(job); QuartzJobDetailsDescriptor jobDetails = this.endpoint.quartzJob("samples", "hello", true); + assertThat(jobDetails).isNotNull(); assertThat(jobDetails.getData()).containsOnly(entry("user", "user"), entry("password", "secret"), entry("url", "https://user:secret@example.com")); } @@ -755,6 +774,7 @@ class QuartzEndpointTests { .build(); mockJobs(job); QuartzJobDetailsDescriptor jobDetails = this.endpoint.quartzJob("samples", "hello", false); + assertThat(jobDetails).isNotNull(); assertThat(jobDetails.getData()).containsOnly(entry("user", "******"), entry("password", "******"), entry("url", "******")); } diff --git a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointWebExtensionTests.java b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointWebExtensionTests.java index d070ec3a178..ee38b116049 100644 --- a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointWebExtensionTests.java +++ b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/endpoint/QuartzEndpointWebExtensionTests.java @@ -47,8 +47,6 @@ import static org.mockito.Mockito.mock; */ class QuartzEndpointWebExtensionTests { - private QuartzEndpointWebExtension webExtension; - private QuartzEndpoint delegate; @BeforeEach @@ -58,19 +56,21 @@ class QuartzEndpointWebExtensionTests { @Test void whenShowValuesIsNever() throws Exception { - this.webExtension = new QuartzEndpointWebExtension(this.delegate, Show.NEVER, Collections.emptySet()); - this.webExtension.quartzJobOrTrigger(null, "jobs", "a", "b"); - this.webExtension.quartzJobOrTrigger(null, "triggers", "a", "b"); + QuartzEndpointWebExtension webExtension = new QuartzEndpointWebExtension(this.delegate, Show.NEVER, + Collections.emptySet()); + webExtension.quartzJobOrTrigger(SecurityContext.NONE, "jobs", "a", "b"); + webExtension.quartzJobOrTrigger(SecurityContext.NONE, "triggers", "a", "b"); then(this.delegate).should().quartzJob("a", "b", false); then(this.delegate).should().quartzTrigger("a", "b", false); } @Test void whenShowValuesIsAlways() throws Exception { - this.webExtension = new QuartzEndpointWebExtension(this.delegate, Show.ALWAYS, Collections.emptySet()); - this.webExtension.quartzJobOrTrigger(null, "a", "b", "c"); - this.webExtension.quartzJobOrTrigger(null, "jobs", "a", "b"); - this.webExtension.quartzJobOrTrigger(null, "triggers", "a", "b"); + QuartzEndpointWebExtension webExtension = new QuartzEndpointWebExtension(this.delegate, Show.ALWAYS, + Collections.emptySet()); + webExtension.quartzJobOrTrigger(SecurityContext.NONE, "a", "b", "c"); + webExtension.quartzJobOrTrigger(SecurityContext.NONE, "jobs", "a", "b"); + webExtension.quartzJobOrTrigger(SecurityContext.NONE, "triggers", "a", "b"); then(this.delegate).should().quartzJob("a", "b", true); then(this.delegate).should().quartzTrigger("a", "b", true); } @@ -79,9 +79,10 @@ class QuartzEndpointWebExtensionTests { void whenShowValuesIsWhenAuthorizedAndSecurityContextIsAuthorized() throws Exception { SecurityContext securityContext = mock(SecurityContext.class); given(securityContext.getPrincipal()).willReturn(mock(Principal.class)); - this.webExtension = new QuartzEndpointWebExtension(this.delegate, Show.WHEN_AUTHORIZED, Collections.emptySet()); - this.webExtension.quartzJobOrTrigger(securityContext, "jobs", "a", "b"); - this.webExtension.quartzJobOrTrigger(securityContext, "triggers", "a", "b"); + QuartzEndpointWebExtension webExtension = new QuartzEndpointWebExtension(this.delegate, Show.WHEN_AUTHORIZED, + Collections.emptySet()); + webExtension.quartzJobOrTrigger(securityContext, "jobs", "a", "b"); + webExtension.quartzJobOrTrigger(securityContext, "triggers", "a", "b"); then(this.delegate).should().quartzJob("a", "b", true); then(this.delegate).should().quartzTrigger("a", "b", true); } @@ -89,9 +90,10 @@ class QuartzEndpointWebExtensionTests { @Test void whenShowValuesIsWhenAuthorizedAndSecurityContextIsNotAuthorized() throws Exception { SecurityContext securityContext = mock(SecurityContext.class); - this.webExtension = new QuartzEndpointWebExtension(this.delegate, Show.WHEN_AUTHORIZED, Collections.emptySet()); - this.webExtension.quartzJobOrTrigger(securityContext, "jobs", "a", "b"); - this.webExtension.quartzJobOrTrigger(securityContext, "triggers", "a", "b"); + QuartzEndpointWebExtension webExtension = new QuartzEndpointWebExtension(this.delegate, Show.WHEN_AUTHORIZED, + Collections.emptySet()); + webExtension.quartzJobOrTrigger(securityContext, "jobs", "a", "b"); + webExtension.quartzJobOrTrigger(securityContext, "triggers", "a", "b"); then(this.delegate).should().quartzJob("a", "b", false); then(this.delegate).should().quartzTrigger("a", "b", false); }