我正在尝试验证 spring-boot 应用程序中的计划任务。在流程中调用静态方法。当服务类被独立测试时,使用 mockedStatic 会按预期工作,但当服务作为计划任务的一部分被调用时则不会。在测试调度程序时,静态方法正在进行真正的方法调用。
提前感谢您的帮助。
@RequiredArgsConstructor
@Component
public class ConnectionHandler
private final ConnectionService connectionService;
private final RequestMapper requestMapper;
@Scheduled(cron="${scheduler.cronTime}")
public void processService() {
...
List<String> idList = getIdList();
idList.forEach(id ->{
var cronRequest = createRequest(id)
sendRequest(cronRequest);
});
}
void sendRequest(CronRequest cronRequest) {
Mono.just(cronRequest)
.doOnNext(request -> log.debug("start request for {}", request.id))
.flatMap(request -> requestMapper.mapRequest(id))
.flatMap(hostRequest -> connectionService->sendRequest(hostRequest))
.onErrorResume(RequestException.class, ex -> log.error("Service error {}-{}", ex.getHttpStatus(), ex.getResponse()))
response -> requestMapper.mapResponse(response))
.contextWrite(RequestUtils.getContext(id))
.block();
}
@ExtendWith(OutputCaptureExtension.class)
@SpringBootTest
@TestPropertySource(locations = "/application-test.properties")
class ConnectionHandlerTest {
@Test
void testScheduledService(CapturedOutput capturedOutput) {
try{MockedStatic<RequestFactory> ignored = mockStatic(RequestFactory.class)) {
RequestConfig requestConfig = new RequestConfig();
requestConfig.setHostIp("10.10.10.10");
requestConfig.setPort(443)
when(RequestFactory.getRequestConfig("ID1")).thenReturn(requestConfig);
await().atMost(2, TimeUnit.MINUTES).untilAsserted(() -> {
assertEquals(1, capturedOutput.getAll().lines.collect(Collectors.toList()).stream.filter(entry -> entry.contains("request completed")).count());
});
}
assertFalse(capturedOutput.getAll().lines.collect(Collectors.toList()).stream.anyMatch(entry -> entry.contains("Service error")));
}
}
我也在等待中尝试了 MockedStatic。 使用 spring-boot 版本 2.7.10 mockito 内联 v5.1.1