【发布时间】:2017-12-15 21:11:25
【问题描述】:
我正在尝试为一个类创建一个单元测试,该类的方法使用 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 作为测试工具。如果你至少能指出我正确的方向,我会非常感激,任何要阅读的材料,书籍,视频,任何东西。我只是想学习以正确的方式去做。
我找到了一些“解决方案”来解决我的问题,但它们都使用 PowerMockito,而且我所读到的内容对你不利,因为它允许模拟静态方法、构造函数等,这会转化为糟糕的编码实践,即我在这里试图避免的事情。
【问题讨论】:
-
所以你想模拟一个静态方法,对吧?
-
不完全是,我想知道的是,我如何以不需要的方式设计该类。比如,如果是你需要打电话,你会如何设计它?
-
我不认为,模拟一个静态方法是不好的。但是,如果您真的想避免,这是要测试的方法吗?我认为,这种方法不值得进行任何单元测试,因为你内部没有任何业务逻辑,你只是“伪装”了一个 spring post call。在我看来,即使是这种方法也需要安装集成测试。
-
我也认为,你有一个很好的 sw 架构 - 框架
post方法的调用在RequestSenderService内部,并且你所有的业务类都使用这个类,因此是松散耦合的。对于他们,你应该编写单元测试来测试他们的逻辑并模拟RequestSenderService,但不是为了这个“包装器”。 -
在单元测试中,您“期望”某些行为以及该方法在特定输入处的某些结果(或异常)。但是你会在这里测试什么?在这种情况下,您没有使用“真正的”框架(没有集成测试),结果总是只是一些
Response模拟,但在您的测试方法中没有发生任何事情。
标签: java spring unit-testing mockito testng