【问题标题】:How can I "intercept" a method call for a test?如何“拦截”测试的方法调用?
【发布时间】:2016-07-26 16:55:57
【问题描述】:

我有这样的课:

class A {

    public static void makeCall() {
        URL url = "www.google.com";
        InputStream result = url.openStream();
        //Do more stuff
    }
}

我想为它写一个单元测试。我想要发生的是“拦截”对openStream() 的调用,以便我可以运行静态方法makeCall() 并返回某种硬编码的JSON,而不是实际进行调用。我无法弄清楚如何模拟这个,或者它是否可能。

我正在寻找与 Angular 的 $httpBackend 相同的行为,有什么想法或建议吗?

【问题讨论】:

  • 您可能应该将 HTTP 代码与您实际尝试测试的逻辑分开(想想依赖注入)。
  • 所以您正在考虑将调用分离为makeHTTPCall(URL url) 之类的内容,然后模拟该方法以返回 JSON?那肯定行得通
  • 如果你真的必须模拟它,使用 JMockit 模拟库很简单(声明一个 @Mocked URL url 模拟字段,然后在 openStream() 上记录所需的期望)。

标签: java unit-testing mocking mockito


【解决方案1】:

您不需要模拟方法成员变量。为了更好的设计,将 url 作为方法中的参数。

public static void makeCall(URL url){

然后在你的测试中通过一个模拟。

这也为未来提供了更大的灵活性和可能的​​代码重用。

【讨论】:

  • 这就是我最终要做的。使其易于模拟,设计感觉更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2011-06-11
  • 2010-11-11
  • 2012-04-01
  • 2021-09-16
相关资源
最近更新 更多