0

Spring Cloud Dalstonを使用して、もちろんZuulを使用するプロキシサービスを構築しました。私は今、Spring Cloud Contractテストを追加して、プロキシサービスが契約順守の観点から期待通りに機能することを確認しようとしています。奇妙なのは、200のステータスコードを返すことができますが、期待される応答本文、コンテンツタイプヘッダーなどが空であり、結果としてテストが失敗するということです。Spring Cloud ContractおよびZuul

Zuul機能を使用するサービスのテストに必要なSpring Cloud Contractドキュメンテーションに追加の設定がありますか?ここで

+0

ほとんどの例があります。あなたはそのようにテストを設定していますか? –

+0

私はDefaultMockMvcBuilderでテストを設定しています。 @Before public void setUp()throws Exception { DefaultMockMvcBuilder webAppContextSetup = MockMvcBuilders.webAppContextSetup(context); MockMvcビルド= webAppContextSetup.build(); RestAssuredMockMvc.mockMvc(ビルド); } } –

+0

mock mvcではなく明示的なモードを使用する必要があります。そうすれば、すべてのフィルタが登録されます –

答えて

0

あなたはZuulの場合、あなたには、いくつかのコントローラとの完全なSpringコンテキストだけでなく、モックMVCをする必要があります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)); 
    } 
} 
関連する問題