使用方法

时间:2017-12-15 21:11:25

标签: java spring unit-testing mockito testng

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

事情是,我不希望每次运行测试时都发送实际请求,如果是单元测试而不是集成测试,则更少。但我不知道如何绕过那条路。

我是测试领域的新手,而且在大多数时候,当你无法测试某些东西时,我的课程设计存在问题。< / p>

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作为测试工具。如果你能指出我正确的方向,任何阅读材料,书籍,视频,任何东西,我都会非常感激。我只想学会以正确的方式去做。

我找到了一些&#34;解决方案&#34;我的问题,但他们都使用PowerMockito,并且我读过的内容对你有害,因为它允许模拟静态方法,构造函数等,这会导致错误的编码实践,这就是我试图避免的这里。

2 个答案:

答案 0 :(得分:3)

出于您的目的,问题更多的是apache的fluent-hc Request.Post,这是静态的,而不是模拟友好的,而不是代码中的。

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

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

这样即使没有模拟,你也可以轻松地模拟代码。

答案 1 :(得分:1)

@lujop已就所提到的问题提出了一个建议,我认为这是一种方法。

但是,关于使用模拟框架的早期声明,我并不是一直都是不好的做法。考虑@lujop的建议,您最终可能会使用Test Double来测试RequestSenderImpl及其业务逻辑。

但是会有一个班级,比如说 - FluentHCRequestSender - 负责实际拨打Request.Post。现在,如果您为所有类编写UT,则必须使用模拟框架来测试FluentHCRequestSender以确保此类使用正确的API。

使用模拟框架进行测试的地方。但一般情况下,如果您的依赖项是您,您的团队或您的组织创建的类,那么如果您最终使用模拟框架,则只会指出一个糟糕的设计。

回答你的资源问题,可以帮助你编写更好的UT和代码,

SOLID principles - 这可能是一件始终在后面的事情    在编写代码时我的想法。

Working Effectively with Legacy Code这对我很有帮助。

Test Driven Development - 在我练习期间,不是很容易    严格遵循你的日常生活,但它至少会迫使我    不要推迟我的UT,并与我的实际同时工作    课程(如果不是之前)。

Design Patterns - 抓住好的设计模式书/视频    如果您可以访问图书馆或购买图书馆。概念可能看起来像    令人生畏,但我发现其中一些在我的日常生活中非常有用    工作,特别是在写UT时。

但就个人而言,这是学习在代码库中查看现有代码并了解哪些代码有用以及哪些内容可以改进的最佳方法。我发现查看并理解由设计好的人编写的代码比任何书都更有用。

希望这篇长篇文章有助于!!

PS - 在试图做正确的方式时感到荣幸。虽然应该这样,但有时并不常说。