junit 通过Open API 3 YAML文件生成的Sping Boot API REST风格端点

pdtvr36n  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(102)

我有一个使用Sping Boot (最新版本)的应用程序,并创建了一个具有REST风格API的后端。通常,我创建的控制器如下:

@RestController
@RequestMapping("/contacts")
public class ContactController {
    @Autowired
    private ContactService service;

        @RequestMapping(value = "/contactId/{contactId}", 
         method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody ContactEntity getContactById(@PathVariable("contactId") long contactId) {
    ContactEntity contactEntity = service.getContactById(contactId);
    return contactEntity;
}

而综合测试一直是这样的:

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = ServiceContextConfiguration.class)
@ComponentScan("com.tomholmes.springboot.phonebook.server")
@Transactional
@WebAppConfiguration    
public class ContactControllerTest {
    @Test
    public void testGetContactById() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = 
            MockMvcRequestBuilders.get(BASE_URL + "/contactId/6");           
        this.mockMvc.perform(requestBuilder)
            .andDo(print())
            .andExpect(status().isOk());
       }
}

多年来,这一直是一个“代码优先”的API。现在,我使用OpenAPI 3和一个YAML文件来处理一个契约优先的API。API在与以前相同的位置生成,我希望测试能像以前一样工作,但它没有。
所以有一个资源:
[https://www.hascode.com/2018/08/testing-openapi-swagger-schema-compliance-with-java-junit-and-assertj-swagger/#API_Test]建议我使用assertj-swagger进行OpenAPI / Swagger合约测试。
这是唯一的路要走吗?有没有办法让我使用我的旧传统测试,我发现作为一个集成测试非常有用。
我还在研究第三种方法:[https://www.testcontainers.org/modules/mockserver/]我也会尝试一下,我相信它会起作用的。
我还想知道是否有代码可以自动生成测试,就像生成API端点和模型一样,如果Open API 3也能够很好地生成测试,这将是有意义的。
最后,如果可以的话,我想使用我的旧测试方法,但如果不行,那么我将尝试其他方法。

bgibtngc

bgibtngc1#

我们在切换到开放式API协定后遇到了同样的问题,首先使用自动生成的控制器/委托接口。修复方法是除了导入控制器本身之外,还导入委托实现。示例:

@WebMvcTest(FeatureController.class)
@Import(FeatureDelegateImpl.class)
public class FeatureContractTest {

  @Autowired
  private MockMvc mvc;

  @MockBean
  private BusinessService businessService;
...

FeatureController是由open-api生成的控制器,通常位于target的generated-sources文件夹中。FeatureDelegateImpl是我们自己的委托接口实现,位于src/main文件夹中。

相关问题