gpt4 book ai didi

java - 在方法内部使用静态调用设计 Java 单元测试

转载 作者:行者123 更新时间:2023-11-29 08:31:25 25 4
gpt4 key购买 nike

我正在尝试为一个类创建一个单元测试,该类的方法使用来自 apache 的 fluent-hc 库 (http://hc.apache.org/httpcomponents-client-ga/fluent-hc/apidocs/org/apache/http/client/fluent/Request.html) 的 Request.Post 方法。

问题是我不希望它在我每次运行测试套件时都发送实际请求,如果它是单元测试而不是集成测试则更不用说。但我不知道如何解决这个问题。

我是测试领域的新手,根据我读到的大部分时间,当你无法测试某些东西时,类的设计存在问题。

public class HttpRequestSenderServiceImpl implements RequestSenderService {

@Override
public Response sendRequest(String address, String messageBody) throws IOException {
Request request = Request.Post(address).bodyString(messageBody, ContentType.APPLICATION_JSON);
Response response = request.execute();

return response;
}

我使用 Spring 框架和 Spring-Test、Mockito 和 TestNG 作为测试工具。如果您至少能为我指明正确的方向,我将非常感激,可以阅读任何 Material 、书籍、视频等等。我只想学习以正确的方式去做。

我找到了一些解决我的问题的“解决方案”,但它们都使用 PowerMockito,而且我读到的内容对你不利,因为允许模拟静态方法、构造函数等,这会转化为不良的编码实践,即我在这里试图避免什么。

最佳答案

就您的目的而言,问题更多出在 apache 的 fluent-hc Request.Post 中,它是静态的并且不模拟友好,而不是在您的代码中。

您可以使用 Executor和模拟执行方法,或者如果你想使用 Request.Post 将它包装在另一个低级服务接口(interface)中并使用它:

interface RequestSender {
Response send(String addr,msgBody)
}

class RequestSenderImpl implements RequestSender {
public Response send(String addr,msgBody) {
Request request = Request.Post(address).bodyString(messageBody,ContentType.APPLICATION_JSON);
Response response = request.execute();
return response;
}
}

即使没有 mockito,您也可以轻松地模拟代码。

关于java - 在方法内部使用静态调用设计 Java 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47839903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com