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:
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());
}
}
}