0

Mit Spring Cloud Dalston haben wir einen Proxy-Service aufgebaut, der natürlich Zuul nutzt. Ich versuche jetzt, Spring Cloud Contract-Tests hinzuzufügen, um zu überprüfen, ob unser Proxy-Service aus Sicht der Vertragstreue wie erwartet funktioniert. Was komisch ist, ist, dass ich eine Anfrage senden und einen Statuscode 200 zurück erhalten kann, aber der erwartete Antworttext, Inhaltstypkopf usw. ist leer und meine Tests scheitern als Ergebnis.Spring Cloud Contract und Zuul

Gibt es zusätzliche Konfigurationen, die nicht in der Spring Cloud Contract-Dokumentation angegeben sind, die für das Testen von Diensten erforderlich ist, die Zuul-Funktionen verwenden?

+0

Wahrscheinlich bei Zuul Sie den vollen Frühling Kontext brauchen und nicht nur Mock mvc mit einigen Controllern. Setzen Sie die Tests auf diese Weise? –

+0

Ich setze die Tests mit dem DefaultMockMvcBuilder. @Before public void setUp() löst Ausnahme aus { DefaultMockMvcBuilder webAppContextSetup = MockMvcBuilders.webAppContextSetup (Kontext); MockMvc build = webAppContextSetup.build(); RestAssuredMockMvc.mockMvc (bauen); } } –

+0

Sie sollten den expliziten Modus nicht mock mvc verwenden. Auf diese Weise werden alle Filter registriert. –

Antwort

0

Hier haben Sie ein Beispiel https://github.com/spring-cloud/spring-cloud-contract/issues/450

/** 
* Abstraction of configuration to test contracts with external microservices which are using a zuul-gateway in between. 
* 
* When a provider of data only allows communication through a Zuul-Gateway, a special way to ensure valid contracts is needed. 
* The Goal is to emulate the Zuul-Interception to be able to use the contracts stored within the providing service. 
* 
* F.e.: Consumer-Service consumes the Provider-Service, but the provider can not be called directly. 
* The Consumer-Service calls an URL with a prefix consisting of the name of the gateway ("gateway") and name of the 
* service (in this example "Provider-Service"). For example: http://gateway/provider/path/to/resource. 
* The contract provided by Provider-Service holds only a part of the provided URL (here: "/path/to/resource"). 
* The resolution of "gateway" and "provider" is done within this class. 
*/ 
@RunWith(SpringRunner.class) 
@SpringBootTest(classes = EmbeddedZuulProxy.class, 
    properties = {"server.port: 8080", 
     "zuul.routes.provider.path: /provider/**", 
     "zuul.routes.provider.service-id: provider", 
     "zuul.routes.provider.url: http://localhost:9090/" //the url of the provider-stub is at port 9090 
    }, 
    webEnvironment = WebEnvironment.DEFINED_PORT) //defined port is important! Ribbon points to zuul, which then points to the provider-stub 
@AutoConfigureMockMvc 
@AutoConfigureJsonTesters 
//the stub runs on fixed port 9090, so that zuul can point to it 
@AutoConfigureStubRunner(ids = "<group-id>:<artifact-id>:+:stubs:9090") 
@DirtiesContext 
public abstract class ZuulContractBase { 

} 

/** 
* Configuration and Setup of an embedded Zuul-Gateway. 
* This way it is possible to use contracts, stored in providing service 
*/ 
@Configuration 
@ComponentScan(basePackages = "<path.to.feign.client>") //autowiring feign client 
@EnableAutoConfiguration 
@EnableZuulProxy 
@EnableFeignClients 
@RibbonClient(name = "gateway", configuration = SimpleRibbonClientConfiguration.class) 
class EmbeddedZuulProxy { 

    @Bean 
    RouteLocator routeLocator(DiscoveryClient discoveryClient, 
           ZuulProperties zuulProperties) { 
     return new DiscoveryClientRouteLocator("/", discoveryClient, zuulProperties); 
    } 
} 

/** 
* Ribbon Load balancer with fixed server list for "simple" pointing to localhost, 
* which holds the mocked zuul-gateway 
* 
* f.e. a call with feign would normally look like: 
* http://gateway/provider/rest/path/to/your/{url} 
* which is mapped to: 
* http://localhost:{zuulport}/provider/rest/path/to/your/{url} 
*/ 
@Configuration 
class SimpleRibbonClientConfiguration { 

    @Value("${server.port}") 
    private Integer zuulPort; 

    @Bean 
    public ServerList<Server> ribbonServerList() { 
     return new StaticServerList<>(new Server("localhost", zuulPort)); 
    } 
} 
Verwandte Themen