Demo思路:创建两个微服务(producer、consumer),consumer服务在service内部使用Feign调用producer服务提供的API,这样在consumer打包时会访问Test测试的配置完成集成测试。
1、 maven pom.xml
参考:http://cloud.spring.io/spring-cloud-contract/
2、生产者测试类的编写
@RunWith(MockitoJUnitRunner.class)
public abstract class ContractVerifierBase {
@Mock
private ProducerService producerService;
@InjectMocks
private ProducerController producerController;
@Before
public void setup() {
given(producerService.create(argThat(messageMatcher()))).willReturn(generate());
RestAssuredMockMvc.standaloneSetup(producerController);
}
private TypeSafeMatcher<String> messageMatcher() {
return new TypeSafeMatcher<String>() {
@Override
protected boolean matchesSafely(String message) {
return "Hello World".equals(message);
}
@Override
public void describeTo(Description description) {
}
};
}
private Message generate() {
String id = "1000";
String message = "Hello Fine";
return new Message(id, message);
}
}
3、生产者,在test-resources/contracts下新建groovy文件
import org.springframework.cloud.contract.spec.Contract
Contract.make {
request {
method 'POST'
url '/producers/message'
body(
"message":"Hello World"
)
headers {
contentType(applicationJson())
}
}
response {
status 200
body("""{
"id": "${value("1000")}",
"content": "${value("Hello Fine!")}"
}""")
headers {
contentType(applicationJson())
}
}
}
4、consumer测试类如下
/**
* 测试
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
@AutoConfigureStubRunner(workOffline = true, ids = {"com.fine.study:producer:+:stubs:10000"})
@DirtiesContext
public class ConsumerControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testConsumer() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/consumers/message")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"message\":\"Hello World\"}"))
.andExpect(status().isOk());
}
}
由于Spring Cloud Contract技术较新,网上资料少,做了一个简单的实践,看了Spring打印的日志信息,理解Spring Cloud Contract在build producer服务时会根据API文档(groovy文件)生成一些测试代码,并将API文档打包生成存根,而在consumer测试类中配置build producer生成的存根(@AutoConfigureStubRunner(workOffline = true, ids = {"com.fine.study:producer:+:stubs:10000"})),完成两个服务之间的集成测试。
代码链接:spring-cloud-contract-study