0

使用Spring Cloud Dalston,我們已經構建了一個代理服務,當然,它使用Zuul。我現在正在嘗試添加Spring Cloud Contract測試,以驗證我們的代理服務是否可以按照合同遵從的角度按預期工作。奇怪的是,我可以發送請求並返回200狀態碼,但預期的響應主體,內容類型標題等是空的,因此我的測試失敗。Spring Cloud Contract和Zuul

在測試使用Zuul功能的服務時,Spring雲合同文檔中是否存在未指定的附加配置?

+0

最有可能在Zuul的情況下,你需要一些控制器全Spring上下文,而不僅僅是模仿MVC。你是以這種方式設置測試嗎? –

+0

我正在使用DefaultMockMvcBuilder進行測試。 @Before public void setUp()throws Exception { DefaultMockMvcBuilder webAppContextSetup = MockMvcBuilders.webAppContextSetup(context); MockMvc build = webAppContextSetup.build(); RestAssuredMockMvc.mockMvc(build); } } –

+0

你應該使用顯式模式而不是mock mvc。這樣所有的過濾器將被註冊 –

回答

0

這裏有一個例子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)); 
    } 
} 
相關問題