如何在我的主测试课中模拟第三课

问题描述 投票:0回答:1

我的测试课如下。我已经使用 @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())));

请问有谁可以帮我吗?

java unit-testing junit mockito spring-test
1个回答
0
投票

我不确定我是否完全理解,但你正在尝试在

tokenService
中测试代码,对吧?不能使用
@InjectMocks
将所有依赖项注入到此类吗?

© www.soinside.com 2019 - 2024. All rights reserved.