我的测试课如下。我已经使用 @BeforeEach 注释和 init() 方法为每个测试初始化了必要的对象。
@ExtendWith(MockitoExtension.class)
public class TokenServiceTest {
@Mock
private KafkaMessageService<KafkaMessageDTO<CredentialsDTO>> messageServiceCredentialsDTO;
@Mock
private EndpointRepository endpointRepository;
@Mock
private KafkaMessageService<String> messageServiceString;
@Spy
private SendRequestToMobie requestSender = new SendRequestToMobie(messageServiceString);
@Test
void testPatchTokenInMobie() {
// Given
Response<String> message = Response.<String>builder().data(null).statusCode(1000).build();
when(credentialService.checkAuthorized(headers)).thenReturn(credential);
when(endpointRepository.findByNameAndRoleAndCredential_IdCredential(OCPIEnum.MODULO_TOKENS.getValue(),
InterfaceRole.RECEIVER.toString(), credential.getIdCredential())).thenReturn(endpoint);
when(messageServiceString.prepareMsg(ResponseEnum.SUCCESS, "SomeMessage")).thenReturn(message);
doNothing().when(messageServiceString).sendMessage(anyString(), any());
String actualResponse = tokenService.patchTokenInMobie(headers, token.getCountryCode(), token.getPartyId(), token.getUid(),
TokenType.fromValue(token.getType()), tokenMobieDTO, false);
// Then
assertEquals(tokenMobieDTO.toString(), actualResponse);
}
}
在
patchTokenInMobie
内,我在下面的部分遇到问题
MobieRequestDTO mobieRequestDTO = new MobieRequestDTO(headers, url, credential.getCredentialReceiver(),
objectName, messageServiceString);
String response = requestSenderToMobie.sendPatchRequest(messageServiceTokenMobieDTO, messageDTO, tokenMobieDTO,
mobieRequestDTO);
我必须在
sendPatchRequest
方法中使用Kafka,并且kafka消息服务始终为空。我不能嘲笑这一点。在这里你可以看到sendPatchRequest
public class SendRequestToMobie {
private KafkaMessageService<String> messageServiceString;
public <T> String sendPatchRequest(KafkaMessageService<KafkaMessageDTO<T>> messageService,
KafkaMessageDTO<T> messageDTO, T objectToRequest, MobieRequestDTO mobieRequestDTO) {
String httpMethod = "PATCH";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(mobieRequestDTO.getUrl()))
.headers(HttpHeaders.AUTHORIZATION, OCPIEnum.TOKEN.getValue() + mobieRequestDTO.getTokenB())
.headers(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.method(httpMethod, HttpRequest.BodyPublishers.ofString(new Gson().toJson(objectToRequest).toString()))
.build();
return send(request, mobieRequestDTO.getHeaders(), mobieRequestDTO.getUrl(), mobieRequestDTO.getEndpoint(),
httpMethod, messageDTO, messageService, objectToRequest);
}
private <T> String send(HttpRequest request, HttpHeaders headers, String url, String endpointName,
String httpMethod, KafkaMessageDTO<T> messageDTO, KafkaMessageService<KafkaMessageDTO<T>> messageService,
T objectToRequest) {
try {
HttpResponse<String> response = HttpClient.newBuilder().build().send(request, BodyHandlers.ofString());
JsonObject convertedObject = new Gson().fromJson(response.body(), JsonObject.class);
Integer statusCode = convertedObject.get("status_code").getAsInt();
if (statusCode >= 1000 && statusCode <= 1999) {
messageServiceString.sendMessage(KafkaTopics.OCPI22.topic,
messageServiceString.prepareMsg(ResponseEnum.SUCCESS, String.format(
MessageEnum.SUCCESS_UPDATE.getMessage(), endpointName, objectToRequest.toString())));
if (convertedObject.get("data") != null) {
return convertedObject.get("data").toString();
}
return null;
}
String errorMsg = MessageFormat.format(MobieErrorEnum.MOBIE_ERROR.getValue(), httpMethod, url,
headers != null ? headers.toString() : null, convertedObject.toString());
if (messageDTO != null) {
messageDTO.setInfo(errorMsg);
messageService.sendMessage(KafkaTopics.OCPI22.topic,
messageService.prepareMsg(ResponseEnum.UNABLE_CLIENT_API, messageDTO));
}
log.error(errorMsg);
return errorMsg;
} catch (Exception e) {
String errorMsg = MessageFormat.format(MobieErrorEnum.MOBIE_ERROR.getValue(), httpMethod, url,
headers != null ? headers.toString() : null, e.toString());
if (messageDTO != null) {
messageDTO.setInfo(errorMsg);
messageService.sendMessage(KafkaTopics.OCPI22.topic,
messageService.prepareMsg(ResponseEnum.UNABLE_CLIENT_API, messageDTO));
}
log.error(errorMsg);
return errorMsg;
}
}
}
内部
SendRequestToMobie
messageServiceString 始终为 null。因此,下面的部分测试总是失败
messageServiceString.sendMessage(KafkaTopics.OCPI22.topic,
messageServiceString.prepareMsg(ResponseEnum.SUCCESS, String.format(
MessageEnum.SUCCESS_UPDATE.getMessage(), endpointName, objectToRequest.toString())));
请问有谁可以帮我吗?
我不确定我是否完全理解,但你正在尝试在
tokenService
中测试代码,对吧?不能使用 @InjectMocks
将所有依赖项注入到此类吗?