当前位置: 首页 > 知识库问答 >
问题:

如何用mockito模拟静态方法做单元测试

桑思远
2023-03-14

我有一个这样的方法。

 public Response post(String json) {

   EventList list = Recorder.getRecorders();
   if (null == list || list.isEmpty()) {
     throw new ServiceUnavailableException("An Recorder is either not configured");
  }
  String targetIUrl = list.getNext().getBase();
  String targetV2Url = targetUrl + "/v2";

 // other processes......
}

>

如果我模拟记录器,是否必须将方法更改为post(字符串json,记录器记录器)?否则,如何使此模拟与该方法交互?

共有1个答案

乐正秦斩
2023-03-14

如果要模拟getRecorders()行为而不使用库模拟静态方法(如Powermock),则必须从内部提取静态调用。有几种选择:

>

  • EventList传递到post()

    public post(String json, EventList list) {
        ...
    }
    

    将事件列表注入到包含post()的类中

    public class TheOneThatContainsThePostMethod {
        private EventList eventList;
    
        public TheOneThatContainsThePostMethod(EventList eventList) {
            this.eventList = eventList;
        }
    
        public post(String json) {
            if (null == this.eventList || this.eventList.isEmpty()) {
                throw new ServiceUnavailableException("An Recorder is either not configured");
            }
        }
    }
    

    将静态方法调用隐藏在另一个类中,并将该类的实例注入post()或包含post()的类。例如:

    public class RecorderFactory {
        public EventList get() {
            return Recorder.getRecorders();
        }
    }
    
    public class TheOneThatContainsThePostMethod {
        private RecorderFactory recorderFactory;
    
        public TheOneThatContainsThePostMethod(RecorderFactory recorderFactory) {
            this.recorderFactory = recorderFactory;
        }
    
        public post(String json) {
            EventList list = recorderFactory.getRecorders();
            ...
        }
    }
    
    // Or ...
    
    public post(String json, RecorderFactory recorderFactory) {
        EventList list = recorderFactory.getRecorders();
        ...
    }
    

    使用前两种方法,您的测试可以简单地调用post(),提供(1)一个空的事件列表;(2) 空的事件列表。。。从而允许您测试“抛出503异常”行为。

    使用第三种方法,您可以使用Mockito模拟RecorderFactory的行为,以返回(1)空的事件列表;(2) 空的事件列表。。。从而允许您测试“抛出503异常”行为。

  •  类似资料:
    • 问题内容: 我已经写了一家工厂来生产物体: 我想验证传递给的参数,但不知道如何模拟静态方法。我在测试用例中使用的是和。有没有模拟或验证此特定用例的好方法? 问题答案: 在Mockito上使用PowerMockito。 示例代码:

    • 问题内容: 嗨,我真的希望您能为我提供帮助,我感觉我已经把头发拉了好几天了。 我正在尝试为方法A编写单元测试。方法A调用静态方法B。我想模拟静态方法B。 我知道以前已经有人问过这个问题,但是我觉得Android从那时起已经成熟,并且必须有一种方法可以执行如此简单的任务,而无需重写我要测试的方法。 这是一个示例,首先是我要测试的方法: 接下来,我要模拟的静态方法: 在其他语言中,这是如此简单,但我无

    • 嗨,我真的希望你能帮助我,我感觉我的头发已经拔了好几天了。 我正在尝试为一个方法a编写单元测试。方法a调用一个静态方法B。我想模拟静态方法B。 我知道以前有人问过这个问题,但我感觉Android从那以后已经成熟了,肯定有一种方法可以做到这么简单的任务,而不用重新编写我想测试的方法。 在其他语言中这是如此容易,但我就是无法使它在Android中工作。我试过Mockito,但似乎不支持静态方法 此错误

    • 我正在尝试使用JUnit、Mockito和PowerMock验证对的调用。 下面是我的测试用例: 下面是测试中的代码: 非常有趣的是,这段代码失败时出现:

    • 实际的方法是在第3行被调用()。我已经添加了和注释。 为什么调用实际方法?我也尝试了PowerMockito.do返回,但是得到了同样的问题。