Спок, заглушающий метод RestTemplate - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь написать тесты для своего клиентского класса, который использует 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()?

...