Nelze zesměšňovat restTemplate

0

Otázka

Rád bych mock následující řádek:

ResponseEntity<String> tokenHttpEntity = restTemplate.postForEntity(builder.build(paramMap), requestHttpEntity , String.class);

A já se snažím udělat to podle tohoto:

ResponseEntity<String> mockedResponse = new ResponseEntity<>(json, HttpStatus.OK);
Mockito.doReturn(mockedResponse).when(restTemplate.exchange(builder.build(paramMap), 
    HttpMethod.GET, new HttpEntity<>(headers), String.class));

Ale když jsem spustit můj test, dostanu následující chybu: enter image description here

By někdo nápad, prosím?

níže testovací třídy, které používají služby pomocí resttemplate:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@Slf4j
public class EnergyWSConsumerTest extends AbstractIntegrationTest {

    public static final String       MOCKED_TOKEN_VALUE = "atoken";
    @Mock
    private             RestTemplate restTemplate;

    @Autowired
    private EnergyWSConsumer energyWSConsumer;

    @Value("${energy.token.request.url}")
    private String tokenRequestUrl;

    @Value("${energy.api.url}")
    private String energyApiUrl;

    @Value("${energy.token.username}")
    private String username;

    @Value("${energy.token.password}")
    private String password;

    private UriComponentsBuilder uriComponentsBuilder;

    private MultiValueMap<String, String> paramMap;

    private URI tokenURI;

    @Before
    public void beforeEach() {
        Mockito.spy(restTemplate);
        energyWSConsumer.setRestTemplate(restTemplate);
        this.initAuthentificationMock();
    }

    @Test
    public void getEvementsRelevesTestCase() throws JSONException, IOException {
        Energy4BisRequest energy4BisRequest = new Energy4BisRequest();
        energy4BisRequest.setEndDate("2021-03-01");
        energy4BisRequest.setStartDate("2021-01-01");
        energy4BisRequest.setType("standard");
        energy4BisRequest.setOrganisationId("D00BPYN-01");
        energy4BisRequest.setDiCodes(List.of("D00DIIR-01"));
        initEvementsRelevesMock(energy4BisRequest);
        energyWSConsumer.getEvementsReleves(energy4BisRequest);
        Assert.assertEquals(MOCKED_TOKEN_VALUE, energyWSConsumer.getToken());
    }

    private void initEvementsRelevesMock(Energy4BisRequest energy4BisRequest) throws IOException {
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("dateDebut", energy4BisRequest.getStartDate());
        paramMap.add("dateFin", energy4BisRequest.getEndDate());
        energy4BisRequest.getDiCodes().forEach(codeDi -> {
            paramMap.add("codeDI", codeDi);
        });

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(energyApiUrl);

        // build the headers
        Map<String, String> headers = new LinkedHashMap<>();
        headers.put("Authorization", "Bearer " + MOCKED_TOKEN_VALUE);


        StringBuilder sb = new StringBuilder();
        String buffer;
        BufferedReader br = new BufferedReader(new FileReader(EnergyWSConsumerTest.class.getClassLoader().getResource("energy-v1-evenements-releves-response.json").getFile()));
        while ((buffer = br.readLine()) != null) {
            sb.append(buffer);
        }
        br.close();
        ObjectMapper objectMapper = new ObjectMapper();
        String json = StringUtils.normalizeSpace(sb.toString());
        EnergyV1ConsumptionReading[] energyV1ConsumptionReadingArray = objectMapper.readValue(json, EnergyV1ConsumptionReading[].class);

        ResponseEntity<String> mockedResponse = new ResponseEntity<>(json, HttpStatus.OK);
//      Mockito.doReturn(mockedResponse).when(restTemplate.exchange(builder.build(paramMap), HttpMethod.GET, new HttpEntity<>(headers),
//              ResponseEntity.class));
        Mockito.doReturn(mockedResponse)
                .when(restTemplate.postForEntity(builder.build(paramMap), new HttpEntity<>(headers), String.class));
    }
}

třída testováno:

@Component
@Slf4j
@Data
public class EnergyWSConsumer {

    public static final String       AUTHORIZATION = "Authorization";
    public static final String       ACCESS_TOKEN  = "access_token";
    @Autowired
    private             RestTemplate restTemplate;

    @Value("${energy.api.url}")
    private String energyApiUrl;

    @Value("${energy.token.request.url}")
    private String tokenRequestUrl;

    @Value("${energy.token.username}")
    private String username;

    @Value("${energy.token.password}")
    private String password;

    private String token;

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }


    public String getEvementsReleves(Energy4BisRequest energy4BisRequest) throws JSONException {
        if (!StringUtils.hasText(token)) {
            log.debug("Token must be generated");
            generateRemoteToken();
        }

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(energyApiUrl);
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("dateDebut", energy4BisRequest.getStartDate());
        paramMap.add("dateFin", energy4BisRequest.getEndDate());
        energy4BisRequest.getDiCodes().forEach(codeDi -> {
            paramMap.add("codeDI", codeDi);
        });

        Map<String, String> headers = new LinkedHashMap<>();
        headers.put("Authorization", "Bearer " + token);

        log.debug("GetEvementsReleves requesting: {}", builder.toUriString());
        HttpEntity<EnergyV1ConsumptionReading[]> energyV1ConsumptionReadingArrayEntity = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, new HttpEntity<>(headers),
                EnergyV1ConsumptionReading[].class);

        log.info(energyV1ConsumptionReadingArrayEntity.toString());
        return null;
    }


    public void generateRemoteToken() throws JSONException {

        log.debug("Request for token generation");

        // build the url with params
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(tokenRequestUrl);
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("grant_type", "client_credentials");

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setBasicAuth(username, password);
        httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity<MultiValueMap<String, String>> requestHttpEntity = new HttpEntity<>(paramMap, httpHeaders);

        log.error("GenerateRemoteTokenURI requesting: {}", builder.toUriString());

        ResponseEntity<String> tokenHttpEntity = restTemplate.postForEntity(builder.build(paramMap), requestHttpEntity, String.class);

        JSONObject response = new JSONObject(tokenHttpEntity.getBody());
        if (response.has(ACCESS_TOKEN)) {
            this.token = response.getString(ACCESS_TOKEN);
            log.debug("Token generated");
        } else {
            log.warn("No token found in the oauth2 token response: {}", tokenHttpEntity.getBody());
        }
    }
}
mockito spring
2021-11-22 10:51:38
1

Nejlepší odpověď

0

Říkáte postForEntity() ale zesměšňovat exchange() metoda. Zkuste následující:

Mockito.doReturn(mockedResponse)
    .when(restTemplate.postForEntity(builder.build(paramMap), new HttpEntity<>(headers), String.class));

Nicméně, chyba se zdá být nesouvisí s tímto, který mě nutí si myslet, že máte další otázky jinde, ale to my nemůžeme řešit, protože pouze společná fragment kódu místo na všechno důležité.


Vyměňte @Mock s @SpyBean a pak se zbavit line Mockito.spy(restTemplate); ve vašem beforeEach() metoda takto:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@Slf4j
public class EnergyWSConsumerTest extends AbstractIntegrationTest {

    public static final String MOCKED_TOKEN_VALUE = "atoken";
    
    @SpyBean
    private RestTemplate restTemplate;

    (...)

    @Before
    public void beforeEach() {
        Mockito.spy(restTemplate);
        energyWSConsumer.setRestTemplate(restTemplate);
        this.initAuthentificationMock();
    }

    (...)
}
2021-11-24 00:16:55

ne, promiň, to samé, opět došlo k výjimce
Adrien Ruffié

Pak se, prosím, přidat další kód. Kompletní třídy, kterou se snaží otestovat a také kompletní testovací třídy. Díky.
João Dias

udělal pro kód
Adrien Ruffié

Aktualizoval jsem svou odpověď, prosím zkontrolujte si to. Díky!!!
João Dias

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................