如何在Springboot中使用嵌入式Web服务器测试POST方法?

时间:2019-07-04 08:48:12

标签: spring-boot testing

我正在寻找一种测试方法的方法,该方法将POST请求发送到外部服务。该应用程序本身不会成为可消耗的Web服务,这就是为什么我没有实现以下所示的类为@ RestController,@ Controller,@ Service的原因,无论其类型如何。

但是我不知道如何调用方法postNumberPlate()来向嵌入式Web服务器(在单元测试中/由/在单元测试中启动)发送请求以对其进行断言。我想避免安装外部Web服务器。

换句话说:我可以在单元测试中启动嵌入式Web服务器并“告诉”它以接受我的POST请求来检查和声明内容吗?

我已经做了:

  • 大规模的Webresearch(2-3天?)
  • 阅读Howto的书
  • 检查springboot文档
  • 使用嵌入式Jetty服务器(以某种方式阻止循环)
  • 将应用程序声明为Web应用程序并将随机端口设置为码头
  • 使用Mockito和MockMVC进行的实验
  • 阅读“ How to unittest a class using RestTemplate offline?”并将其与我的案例进行比较,但发现,
    • 它已经很老了(8岁)
    • 我不知道如何实现父接口,这是非常大的
    • 问题和答案过于笼统,无法为我的案例推论出解决方案
    • 它无法回答我所包含的嵌入式测试Web服务器问题。

要测试的课程:

public class RestfulClient {

    private RestTemplate restTemplate = new RestTemplate();
    private HttpHeaders headers = new HttpHeaders();

    @Value("${kafkaeskadapter.uri}")
    private String destinationURL;

    public RestfulClient() {}

    public ResponseEntity<String> postNumberPlate(String key, CamImage camImage) {

        LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        map.add("numplate", camImage.getIdentifier());
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<LinkedMultiValueMap<String,
                Object>>(map, headers);

        ByteArrayResource resource = new ByteArrayResource(camImage.getData()) {
            /**
             * IMPORTANT!!! Otherwise I receive a BAD REQUEST
             * @return
             */
            @Override
            public String getFilename() {
                return camImage.getIdentifier() + ".png";
            }
        };
        map.add("image", resource);

        ResponseEntity<String> result = restTemplate.exchange(destinationURL, HttpMethod.POST,
                requestEntity, String.class);

        return result;
    }
}

我希望我能澄清一下我的问题。

1 个答案:

答案 0 :(得分:0)

一种解决方案是编写一个简单的轻量级Web服务端点,并将其包含在您的IDE的“运行配置”中。我创建了一个单独的小型项目,并在需要时添加其他方法,例如接受不同的媒体。

在运行实际的单元测试之前,可以配置端点的开始并返回有意义的ResponseEntity。可以检查结果,也可以断言。

关于StackOverflow用户傲慢的一句话:@Raedwald,在阅读并尝试后,链接问题中的答案并没有真正的帮助,但是涉及到很多知识,而且我的同事们也没有人,这可以协助编程。因此,将我的问题标记为删除无济于事。