Я пытаюсь написать тесты для своего клиентского класса, который использует RestTemplate
для получения файлов из моего облака (метод getSingleFileContentMap()
).
Это полный код класса клиента:
package i18n.translationbundle.client;
import i18n.configuration.TranslationProperties;
import i18n.translationbundle.TranslationBundle;
import lombok.RequiredArgsConstructor;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Component
@RequiredArgsConstructor
public class DotCMSClient implements TranslationBundleSupplier {
private final TranslationProperties translationProperties;
private final RestTemplate template;
@Override
public TranslationBundle getTranslationBundle(String language) {
Set<Map<String, String>> set = getTranslationsSetForLanguage(language);
return new TranslationBundle(
set.stream()
.flatMap(x -> x.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v2
)));
}
private Set<Map<String, String>> getTranslationsSetForLanguage(String language) {
return translationProperties.getResourceUrls()
.get(language)
.values()
.stream()
.map(this::getSingleFileContentMap)
.collect(Collectors.toSet());
}
private Map<String, String> getSingleFileContentMap(String location) {
String domainAddress = translationProperties.getSourceDomain();
return template.exchange(domainAddress + location, HttpMethod.GET, null, new ParameterizedTypeReference<Map<String, String>>(){}).getBody();
}
}
Моя цель - поставить getSingleFileContent()
в моих тестах, поэтому мне не придется полагаться на соединение. Вот два способа, как я пытался заглушить это:
client.getSingleFileContentMap("dashboard") >> mapper.readValue(
dashboardJson,
new TypeReference<Map<String, String>>(){})
и
template.exchange("src/test/resources/en-us/dashboard.lang.json", HttpMethod.GET, null, new ParameterizedTypeReference<Map<String, String>>(){}) >>
mapper.readValue(
dashboardJson,
new TypeReference<Map<String, String>>(){})
Тем не менее, я получаю следующую ошибку:
client.getSingleFileContentMap("dashboard")
| |
| java.lang.IllegalArgumentException: URI is not absolute
<translationbundle.client.DotCMSClient@b978d10 translationProperties=TranslationProperties(sourceDomain=, fileNames=null, languages=[en-us], resourceUrls={en-us={dashboard=src/test/resources/en-us/dashboard.lang.json, ip-block=src/test/resources/en-us/ip-block.lang.json, general=src/test/resources/en-us/general.lang.json}}) template=org.springframework.web.client.RestTemplate@2ce6c6ec>
Что я делаю не так? Разве заглушка не должна слепо возвращать то, что я хочу, не вмешиваясь в реализацию методов? Здесь кажется, что он все еще работает getSingleFileContentMap()
так, как это было реализовано в коде класса клиента. Я понимаю, что метод stubbing Rest Template
exchange()
может не работать, но почему он не работает с getSingleFileContentMap()
?