【问题标题】:How to test a POSTing method by using an embedded Webserver in Springboot?如何在 Spring Boot 中使用嵌入式 Web 服务器测试 POSTing 方法?
【发布时间】:2019-07-04 08:48:12
【问题描述】:

我正在寻找一种方法来测试一种方法,该方法将 POST 请求发送到外部服务。该应用程序本身不会是一个可消费的 Web 服务,这就是为什么我没有将下面显示的类实现为 @RestController、@Controller、@Service,无论可能有什么类型。

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

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

我已经这样做了:

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

要测试的类:

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;
    }
}

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

【问题讨论】:

  • 明确一点..你想做一个集成测试..不是单元测试对吗?你真的想调用 restTemplate.exchange.. 还是只是模拟它/
  • 好点。也许是集成测试的 1/2,也许是 2/3(因为该方法与外部 Web 服务联系),虽然 1/3 是单元测试,因为我想看看请求是否包含正确的结构和当然要了解春天吐出来的东西。所以我需要调用restTemplate.exchange(...)。因为我想为 exchange() 方法提供一个端点来系统输出接收到的内容。 :-)
  • @Raedwald 对不起,但我不这么认为。 OP的问题和答案是完全通用的,并没有解决我描述的问题。此外,我认为实现 RestTemplate 的任何巨大父接口并破坏代码并不是一个好主意,因为我无法监督依赖 spring 单元测试帮助程序类的副作用。这里是关于如何使用一个简单的“webserver”对象来提供它作为一个端点来检查它是什么以及它是如何发送的,以检查和断言消息,而无需安装一个完全成熟的 web 服务器。问候。

标签: spring-boot testing


【解决方案1】:

一个解决方案是编写一个简单的轻量级 Web 服务端点并将其包含到您的 IDE 的运行配置中。 我制作了一个单独的迷你项目,如果需要,我会添加更多方法,例如接受不同的媒体。

在运行实际的单元测试之前,可以配置 Endpoint 的开始并返回一个有意义的ResponseEntity。结果可以被检查等等,断言是可能的。

关于 StackOverflow 用户傲慢的一句话:@Raedwald,在阅读和尝试之后,链接问题中的答案并不是很有帮助,但涉及到很多关于这些东西的知识,而且我周围没有我的同事,这可以帮助编程。因此,将我的问题标记为删除是没有帮助的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 2020-10-24
    • 2016-08-26
    • 2019-10-11
    • 2018-10-09
    • 2016-11-03
    • 2019-05-01
    • 2020-09-05
    相关资源
    最近更新 更多