Потребитель контракта Spring Cloud | Макет OkHttp

Мой основной класс выглядит примерно так:

class MyClass{

    String bar(String inputString){
        String url = "https:x.y.z/p/q";  //the URL is framed dynamically based on other class attributes
        final String payloadInJson = getPayload(inputString)
        final String response = doPostRequest(url, payloadInJson)
    }

    private static String doPostRequest(final String url, final String postData) throws IOException {
        final RequestBody body = RequestBody.create(JSON, postData)
        final Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build()
        final Response response = createOkHttpClient().newCall(request).execute()
        if (!response.isSuccessful()) {
            throw new RuntimeException("...")
        }
        response.networkResponse().header("Location")
    }


    private static OkHttpClient createOkHttpClient() {
        Config config = new ConfigBuilder()
                .withTrustCerts(true)
                .build()
        def httpClient = HttpClientUtils.createHttpClient(config)
        httpClient = httpClient.newBuilder().authenticator(Authenticator.NONE).build()
        httpClient
    }

}

и тестовый пример My Consumer:

@SpringBootTest(classes = Application.class)
@AutoConfigureStubRunner(stubsMode = StubRunnerProperties.StubsMode.LOCAL, ids = ["com.ex:foobar:+:stubs:8090"])
class MyClassTest{
     @Inject
     private MyClass myClass

     def 'happyPath'(){
         given:
         ...
         when:
            String res = myClass.bar('lorem...')
     }
}

Вопрос в том, как издеваться над URL-адресом OkHttp и использовать localhost? Или это то, что в тестовом примере я могу сослаться на фактический URL-адрес в рамке?


person jai    schedule 07.08.2018    source источник


Ответы (1)


Если вы используете Spring Cloud Contract, мы запускаем HTTP-сервер на заданном или случайном порте. Вам достаточно настроить OK Http Client, чтобы он указывал на запущенный сервер. Пример

ПСЕВДОКОД:

class MyClass{
private String url = "https:x.y.z/p/q";

String bar(String inputString){
        final String payloadInJson = getPayload(inputString)
        final String response = doPostRequest(this.url, payloadInJson)
    }

// package scope
void setUrl(String url) {
this.url = url;
}
}

и в своем тесте вы можете установить порт заглушки и URL-адрес

ТЕСТ (СНОВА ПСЕВДОКОД):

@SpringBootTest(classes = Application.class)
@AutoConfigureStubRunner(stubsMode = StubRunnerProperties.StubsMode.LOCAL, ids = ["com.ex:foobar"])
class MyClassTest{
     @Inject
     private MyClass myClass

     @StubRunnerPort("foobar") int stubPort;

     def 'happyPath'(){
         given:
         myClass.url = "http://localhost:${stubPort}"
         when:
            String res = myClass.bar('lorem...')
     }
}

лучший вариант - использовать правильный класс @Configuration, в котором вы определяете bean-компоненты и вставляете URL-адрес через конструктор. В любом случае, надеюсь, это покажет вам, как вы можете подойти к проблеме.

person Marcin Grzejszczak    schedule 07.08.2018
comment
По сути, инкапсулируйте то, что меняется, не так ли? :) - person jai; 07.08.2018
comment
Совершенно верно :) Таким образом, вы можете легко изменить это - person Marcin Grzejszczak; 07.08.2018