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

l5tcr1uw  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(52)

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

@ActiveProfiles("test")
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@DirtiesContext
@AutoConfigureMessageVerifier
public class BaseTestClass {

    @Autowired
    private MyController myController;

    @MockBean
    private MyService myService;

    @BeforeEach
    public void SetUp() {
        StandaloneMockMvcBuilder standaloneMockMvcBuilder
                = MockMvcBuilders.standaloneSetup(channelController);
        standaloneMockMvcBuilder.setControllerAdvice(new MyExceptionHandler());
        standaloneMockMvcBuilder.setMessageConverters(new MappingJackson2HttpMessageConverter());
        RestAssuredMockMvc.standaloneSetup(standaloneMockMvcBuilder);
        //mockGetAllChannels(); // when it was the only contract, mock was called here
    }

    @Test
    void testChannelsOk() {
        mockGetAllChannels(createChannelList());
    }

    @Test
    void testEmptyList() {
        mockGetAllChannels(Collections.emptyList());
    }

    private void mockGetAllChannels(List<ChannelResponse.Channel> channelList) {
        doReturn(ChannelResponse.builder()
                .channels(channelList)
                .build())
                .when(myService)
                .getAllChannels();
    }

    private List<ChannelResponse.Channel> createChannelList() {
        //generation logic
}

字符串
Groovy文件:

[
        Contract.make {
            name("two channels")
            request {
                method 'GET'
                url('/channels')
                headers {
                    header('Content-Type', 'application/json;charset=UTF-8')
                }
            }
            response {
                status 200
                body(
                        channels: [[
                                           id     : anyNonBlankString(),
                                           name   : anyNonBlankString(),
                                   ]
                        ]
                )
            }
        },

        Contract.make {
            name("empty list")
            request {
                method 'GET'
                url('/channels')
                headers {
                    header('Content-Type', 'application/json;charset=UTF-8')
                }
            }
            response {
                status 200
                body(
                        channels: []
                )
            }
        }
]


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

@Test
    void testEmptyList()


但它不起作用

x7rlezfr

x7rlezfr1#

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

import org.springframework.cloud.contract.spec.Contract

[
    Contract.make {
        name("should return id 1")
        request {
            method 'GET'
            url('/person/1')
        }
        response {
            status OK()
            headers {
                contentType(applicationJson())
            }
        }
    },
    Contract.make {
        name("should return id 2")
        request {
            method 'GET'
            url('/person/2')
        }
        response {
            status OK()
            headers {
                contentType(applicationJson())
            }
        }
    }
]

字符串
我的基类

@SpringBootTest(classes = Application.class)
public abstract class BaseClass {

    @Autowired PersonRestController personRestController;
    @MockBean PersonService personService;

    @BeforeEach public void setup() {
        RestAssuredMockMvc.standaloneSetup(personRestController);

        when(personService.findPersonById(1L)).thenReturn(new Person(1L, "foo", "bee"));
        when(personService.findPersonById(2L)).thenReturn(new Person(2L, "foo", "bee"));
    }
}

相关问题