Облачный контракт Spring: сгенерированный тест не имеет настроенного MockMVC и не компилируется

Я сталкиваюсь с этим: «Вы не настроили экземпляр MockMVC». исключение, когда "mvn clean install".

Бег

org.springframework.cloud.contract.verifier.tests.ContractVerifierTest Запущенных тестов: 1, отказов: 0, ошибок: 1, пропущенных: 0, истекшего времени: 0,185 сек. - в org.springframework.cloud.contract.verifier.tests.ContractVerifierTest validate_shouldGetAilities (org.springframework.cloud.contract.verifier.tests.ContractVerifierTest) Истекшее время: 0,184 с java.lang.IllegalStateException: вы не настроили экземпляр MockMVC. Вы можете сделать это статически

или используя DSL:

данный(). mockMvc (..). ..

Дело в том, что тест, вызывающий это исключение, - это тест, который генерируется на основе контракта.

Вот договор.

package contracts

org.springframework.cloud.contract.spec.Contract.make {
    request {
        method 'GET'
        url '/abc/def/serviceA?catalog=x'
        body("")
    }
    response {
        status 200
        body(""
        )
        headers {
            contentType(applicationJsonUtf8())
        }
    }
}

Вот сгенерированный тест.

package org.springframework.cloud.contract.verifier.tests;

public class ContractVerifierTest {

@Test
public void validate_shouldGetMyStuff() throws Exception {
        // given:
        MockMvcRequestSpecification request = given()
                .body("\"\"");

        // when:
            ResponseOptions response = given().spec(request)
                .get("/abc/def/serviceA?catalog=x");

        // then:
            assertThat(response.statusCode()).isEqualTo(200);
            assertThat(response.header("Content-Type")).matches("application/json;charset=UTF-8.*");
        // and:
            String responseBody = response.getBody().asString();
            assertThat(responseBody).isEqualTo("");
    }

}

Очевидно, что экземпляр MockMVC не запускается в сгенерированном тесте. В сообщении об исключении предлагается запустить его в тесте. Однако это сгенерированный тест (в «целевой» папке). Неважно, что я туда добавляю, он стирается после "mvn clean install".

Кто-нибудь сталкивался с этим? Мой контракт неправильный? Вот почему в сгенерированном тесте не сгенерировалась стартовая часть MockMVC?

Другая проблема заключается в том, что URL-адрес в контракте является простым получением. Он возвращает сообщение в формате Json. Но пока я просто хочу сделать это очень простым, проверяя только код состояния 200, не проверяя сообщение.

Еще одна особенность этого URL-адреса заключается в том, что я попробовал этот URL-адрес в почтальоне и получил ответ. Я предполагаю, что это должен быть URL-адрес, который я использую в своем контракте. Это предположение неверно? Нужно ли мне по-другому формировать этот URL в контракте?

Кроме того, в почтальоне, когда я запрашиваю "GET" с этим URL-адресом, у меня ничего нет в "теле". Вот почему я оставил "body" в контракте пустым (""). Это правильный способ? Может ли это повлиять на созданный тест?

Любые подсказки будут оценены.

at   com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.performRequest(MockMvcRequestSenderImpl.java:101)
at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:296)
at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:367)
at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:47)
at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSpecificationImpl.get(MockMvcRequestSpecificationImpl.java:565)
at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSpecificationImpl.get(MockMvcRequestSpecificationImpl.java:42)
at
  org.springframework.cloud.contract.verifier.tests.ContractVerifierTest.validate_shouldGetAmenities(ContractVerifierTest.java:23)

person Eric    schedule 23.02.2017    source источник
comment
Трассировка стека после given (). mockMvc (..). .. вставляется в конце сообщения. Как-то не могу вставить его посередине.   -  person Eric    schedule 27.02.2017


Ответы (1)


Оказывается, мне нужно добавить базовый класс, который мне не хватает (например, FraudBase.java) в образце. Вот где создается экземпляр MockMvc.

person Eric    schedule 28.02.2017
comment
Я почти уверен, что пару раз в документации написано, что вам нужен базовый класс. - person Marcin Grzejszczak; 12.03.2017
comment
это обязательно - без этого мы не сможем настроить фиктивный контекст mvc - person Marcin Grzejszczak; 16.03.2017
comment
Это должно быть в сообщении об ошибке как одна из возможных причин: P - person Josue Abarca; 23.05.2018
comment
Спасибо Эрику за публикацию этого ответа. Я столкнулся с той же проблемой, но не могу найти полного решения. Пожалуйста, не могли бы вы опубликовать полное решение с базовым классом и полную реализацию базового класса. Пожалуйста. - person Renat Gatin; 19.04.2019
comment
Привет, Ренат, обратитесь к этому документу и выполните поиск по этому запросу на странице, открытый класс FraudBase. Именно этот базовый класс вам нужен для работы в вашей кодовой базе. Базовый класс, с которым я работал, - это IP нашей компании, и я не могу его опубликовать. И это не очень важно для того, что вам нужно делать в вашей кодовой базе. Но важно то, что вам нужно иметь это в базовом классе. @Before public void setup () {RestAssuredMockMvc.standaloneSetup (новый FraudDetectionController (), новый FraudStatsController (stubbedStatsProvider ())); } - person Eric; 23.04.2019
comment
RestAssuredMockMvc.standaloneSetup () - это то, что Spring Cloud Contract использует для запуска локального MockMvc для запуска stubs.jar. Я помню, что пропустил эту строку, и именно поэтому она не сработала для меня и запустила этот пост. Помимо этой строки, остальное - это все, что вам нужно в вашем контексте для запуска локального приложения. Это может быть имя класса, например something.class в аннотации, или какой-то webApplicationContext, который вам нужно предоставить. - person Eric; 23.04.2019
comment
Извините, я забыл вставить ссылку на документ, который я упомянул выше, вот она, cloud.spring.io/spring-cloud-contract/ выполните поиск по общедоступному классу FraudBase. - person Eric; 23.04.2019