From 279de1aeacf395ddbd4aaf9a8ac8d5a7568a3b88 Mon Sep 17 00:00:00 2001 From: Said Boudjelda Date: Sat, 17 Oct 2026 21:52:49 +0200 Subject: [PATCH] test(kates): the tests that stub a mock a scheduled job also calls run with the scheduler off, so the job cannot take the stub AdvisorResourceTest.analyzeReturns404ForMissingRun failed on CI (PR #376) with "WrongTypeOfReturnValue: Optional cannot be returned by findByStatus()". Mockito ties when(mock.call()).thenReturn(...) to the last call made on that mock, from any thread. The timeout reaper calls findByStatus on the mocked TestRunRepository every 60 s; when that call lands between the test's findById and its thenReturn, the stub goes to findByStatus. doReturn().when() has the same window. Each of the five classes stubs a mock that a job calls: - AdvisorResourceTest, ReportResourceTest: TestRunRepository, called by TestTimeoutReaper.reapStuckTests (findByStatus). - ScheduleResourceTest: ScheduledTestRunRepository, called by TestScheduler.evaluateSchedules (findAllEnabled); TrogdorClient, called by the run reconciler for the runs the test starts. - TestResourceTest: TrogdorClient, called by TestOrchestrator.reconcileActiveRuns for the runs the test starts. - TrendServiceTest: ClusterHealthService, called by KafkaReachabilityCache.refresh (isReachable). None of them needs a job to fire: they read runs over GET, which refreshes the run itself. SchedulerOffTestProfile sets quarkus.scheduler.enabled=false and the five classes use it. Every other test keeps the scheduler as before. --- .../kates/SchedulerOffTestProfile.java | 22 +++++++++++++++++++ .../kates/api/AdvisorResourceTest.java | 3 +++ .../bmscomp/kates/api/TestResourceTest.java | 3 +++ .../kates/report/ReportResourceTest.java | 3 +++ .../kates/schedule/ScheduleResourceTest.java | 3 +++ .../bmscomp/kates/trend/TrendServiceTest.java | 3 +++ 6 files changed, 37 insertions(+) create mode 100644 kates/src/test/java/com/bmscomp/kates/SchedulerOffTestProfile.java diff --git a/kates/src/test/java/com/bmscomp/kates/SchedulerOffTestProfile.java b/kates/src/test/java/com/bmscomp/kates/SchedulerOffTestProfile.java new file mode 100644 index 00000000..122b06d0 --- /dev/null +++ b/kates/src/test/java/com/bmscomp/kates/SchedulerOffTestProfile.java @@ -0,0 +1,22 @@ +package com.bmscomp.kates; + +import java.util.Map; + +import io.quarkus.test.junit.QuarkusTestProfile; + +/** + * Turns every {@code @Scheduled} job off, for a test that stubs an + * {@code @InjectMock} bean a job also calls. + * + *

Mockito ties {@code when(mock.call()).thenReturn(...)} to the last call + * made on that mock, from any thread. A job that calls the mock while the + * test stubs it, as the timeout reaper's {@code findByStatus} did, takes the + * stub, and the test fails with {@code WrongTypeOfReturnValue}. + */ +public class SchedulerOffTestProfile implements QuarkusTestProfile { + + @Override + public Map getConfigOverrides() { + return Map.of("quarkus.scheduler.enabled", "false"); + } +} diff --git a/kates/src/test/java/com/bmscomp/kates/api/AdvisorResourceTest.java b/kates/src/test/java/com/bmscomp/kates/api/AdvisorResourceTest.java index 515ea496..1ecf76fc 100644 --- a/kates/src/test/java/com/bmscomp/kates/api/AdvisorResourceTest.java +++ b/kates/src/test/java/com/bmscomp/kates/api/AdvisorResourceTest.java @@ -7,16 +7,19 @@ import io.quarkus.test.InjectMock; import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; import io.restassured.RestAssured; import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import com.bmscomp.kates.SchedulerOffTestProfile; import com.bmscomp.kates.domain.TestRun; import com.bmscomp.kates.domain.TestType; import com.bmscomp.kates.service.AdvisorService; import com.bmscomp.kates.service.TestRunRepository; @QuarkusTest +@TestProfile(SchedulerOffTestProfile.class) class AdvisorResourceTest { @InjectMock diff --git a/kates/src/test/java/com/bmscomp/kates/api/TestResourceTest.java b/kates/src/test/java/com/bmscomp/kates/api/TestResourceTest.java index 49412c75..04d0f059 100644 --- a/kates/src/test/java/com/bmscomp/kates/api/TestResourceTest.java +++ b/kates/src/test/java/com/bmscomp/kates/api/TestResourceTest.java @@ -10,6 +10,7 @@ import io.quarkus.test.InjectMock; import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; import org.eclipse.microprofile.rest.client.inject.RestClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -17,6 +18,7 @@ import org.junit.jupiter.params.provider.EnumSource; import org.mockito.ArgumentCaptor; +import com.bmscomp.kates.SchedulerOffTestProfile; import com.bmscomp.kates.domain.TestResult; import com.bmscomp.kates.domain.TestRun; import com.bmscomp.kates.domain.TestSpec; @@ -28,6 +30,7 @@ import com.bmscomp.kates.trogdor.spec.ProduceBenchSpec; @QuarkusTest +@TestProfile(SchedulerOffTestProfile.class) class TestResourceTest { @InjectMock diff --git a/kates/src/test/java/com/bmscomp/kates/report/ReportResourceTest.java b/kates/src/test/java/com/bmscomp/kates/report/ReportResourceTest.java index f17447f6..9d6c499a 100644 --- a/kates/src/test/java/com/bmscomp/kates/report/ReportResourceTest.java +++ b/kates/src/test/java/com/bmscomp/kates/report/ReportResourceTest.java @@ -8,17 +8,20 @@ import io.quarkus.test.InjectMock; import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; import io.restassured.RestAssured; import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import com.bmscomp.kates.SchedulerOffTestProfile; import com.bmscomp.kates.domain.TestResult; import com.bmscomp.kates.domain.TestRun; import com.bmscomp.kates.domain.TestType; import com.bmscomp.kates.service.TestRunRepository; @QuarkusTest +@TestProfile(SchedulerOffTestProfile.class) class ReportResourceTest { @InjectMock diff --git a/kates/src/test/java/com/bmscomp/kates/schedule/ScheduleResourceTest.java b/kates/src/test/java/com/bmscomp/kates/schedule/ScheduleResourceTest.java index 500c25d3..862849ff 100644 --- a/kates/src/test/java/com/bmscomp/kates/schedule/ScheduleResourceTest.java +++ b/kates/src/test/java/com/bmscomp/kates/schedule/ScheduleResourceTest.java @@ -19,6 +19,7 @@ import io.quarkus.test.InjectMock; import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; import io.restassured.RestAssured; import io.restassured.http.ContentType; import org.eclipse.microprofile.rest.client.inject.RestClient; @@ -33,11 +34,13 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +import com.bmscomp.kates.SchedulerOffTestProfile; import com.bmscomp.kates.domain.TestType; import com.bmscomp.kates.service.TopicService; import com.bmscomp.kates.trogdor.TrogdorClient; @QuarkusTest +@TestProfile(SchedulerOffTestProfile.class) class ScheduleResourceTest { @InjectMock diff --git a/kates/src/test/java/com/bmscomp/kates/trend/TrendServiceTest.java b/kates/src/test/java/com/bmscomp/kates/trend/TrendServiceTest.java index 81113807..391c180d 100644 --- a/kates/src/test/java/com/bmscomp/kates/trend/TrendServiceTest.java +++ b/kates/src/test/java/com/bmscomp/kates/trend/TrendServiceTest.java @@ -13,11 +13,13 @@ import io.quarkus.test.InjectMock; import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; import io.restassured.RestAssured; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import com.bmscomp.kates.SchedulerOffTestProfile; import com.bmscomp.kates.domain.TestResult; import com.bmscomp.kates.domain.TestRun; import com.bmscomp.kates.domain.TestSpec; @@ -37,6 +39,7 @@ * found it. */ @QuarkusTest +@TestProfile(SchedulerOffTestProfile.class) class TrendServiceTest { private static final String TOPIC = "trend-topic";