如何为一个方法添加多个合约?使用Spring Cloud Contract Verifier + groovy进行合约测试

l5tcr1uw  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(119)

我尝试为一个方法创建两种情况:当响应包含一个元素列表和一个空列表时。我有BaseTestClass用于这两种情况,但响应体生成应该根据合约而不同。这可能吗?如果是,如何做到这一点?BaseTestClass如何知道调用哪个mock?

  1. @ActiveProfiles("test")
  2. @ExtendWith(SpringExtension.class)
  3. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
  4. @DirtiesContext
  5. @AutoConfigureMessageVerifier
  6. public class BaseTestClass {
  7. @Autowired
  8. private MyController myController;
  9. @MockBean
  10. private MyService myService;
  11. @BeforeEach
  12. public void SetUp() {
  13. StandaloneMockMvcBuilder standaloneMockMvcBuilder
  14. = MockMvcBuilders.standaloneSetup(channelController);
  15. standaloneMockMvcBuilder.setControllerAdvice(new MyExceptionHandler());
  16. standaloneMockMvcBuilder.setMessageConverters(new MappingJackson2HttpMessageConverter());
  17. RestAssuredMockMvc.standaloneSetup(standaloneMockMvcBuilder);
  18. //mockGetAllChannels(); // when it was the only contract, mock was called here
  19. }
  20. @Test
  21. void testChannelsOk() {
  22. mockGetAllChannels(createChannelList());
  23. }
  24. @Test
  25. void testEmptyList() {
  26. mockGetAllChannels(Collections.emptyList());
  27. }
  28. private void mockGetAllChannels(List<ChannelResponse.Channel> channelList) {
  29. doReturn(ChannelResponse.builder()
  30. .channels(channelList)
  31. .build())
  32. .when(myService)
  33. .getAllChannels();
  34. }
  35. private List<ChannelResponse.Channel> createChannelList() {
  36. //generation logic
  37. }

字符串
Groovy文件:

  1. [
  2. Contract.make {
  3. name("two channels")
  4. request {
  5. method 'GET'
  6. url('/channels')
  7. headers {
  8. header('Content-Type', 'application/json;charset=UTF-8')
  9. }
  10. }
  11. response {
  12. status 200
  13. body(
  14. channels: [[
  15. id : anyNonBlankString(),
  16. name : anyNonBlankString(),
  17. ]
  18. ]
  19. )
  20. }
  21. },
  22. Contract.make {
  23. name("empty list")
  24. request {
  25. method 'GET'
  26. url('/channels')
  27. headers {
  28. header('Content-Type', 'application/json;charset=UTF-8')
  29. }
  30. }
  31. response {
  32. status 200
  33. body(
  34. channels: []
  35. )
  36. }
  37. }
  38. ]


我也试着把它放在单独的文件中,我不确定哪种方法更好。我看到了这样一个做多个合同的例子:

  1. @Test
  2. void testEmptyList()


但它不起作用

x7rlezfr

x7rlezfr1#

查看文档
我设法在同一个groovy文件中添加了多个合约,如下所示:
我的groovy文件

  1. import org.springframework.cloud.contract.spec.Contract
  2. [
  3. Contract.make {
  4. name("should return id 1")
  5. request {
  6. method 'GET'
  7. url('/person/1')
  8. }
  9. response {
  10. status OK()
  11. headers {
  12. contentType(applicationJson())
  13. }
  14. }
  15. },
  16. Contract.make {
  17. name("should return id 2")
  18. request {
  19. method 'GET'
  20. url('/person/2')
  21. }
  22. response {
  23. status OK()
  24. headers {
  25. contentType(applicationJson())
  26. }
  27. }
  28. }
  29. ]

字符串
我的基类

  1. @SpringBootTest(classes = Application.class)
  2. public abstract class BaseClass {
  3. @Autowired PersonRestController personRestController;
  4. @MockBean PersonService personService;
  5. @BeforeEach public void setup() {
  6. RestAssuredMockMvc.standaloneSetup(personRestController);
  7. when(personService.findPersonById(1L)).thenReturn(new Person(1L, "foo", "bee"));
  8. when(personService.findPersonById(2L)).thenReturn(new Person(2L, "foo", "bee"));
  9. }
  10. }

展开查看全部

相关问题