【问题标题】:how to mock static method of a class with no return type如何模拟没有返回类型的类的静态方法
【发布时间】:2021-12-04 19:25:38
【问题描述】:

我需要模拟一个同样无效的类的静态方法。所以,假设我的班级是。

class Util{
public static void test(){}
}

还有调用 Util 方法的 Action 类

class Action{
public void update(){
Util.test();
}

}

我的测试课是:

class Test{
Action action=new Action();
action.update();

//want to 
}

我的问题是如何模拟一个类并验证它的方法是否被调用 Util.test(); 我该怎么说:

given(Util.test());//在这种情况下我不能放 willReturn 因为它的类型是 void

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    你没有;这会导致各种问题。相反,要么测试你的静态方法的最终效果(尽管最好是静态方法没有副作用),或者用诸如RunnableConsumer之类的功能接口替换对静态方法的调用并传递@ 987654323@ 到Action 构造函数。

    【讨论】:

      【解决方案2】:

      您可以使用 verify() 中的 Mockito 这个。

      import static org.mockito.Mockito.atLeast;
      import static org.mockito.Mockito.times;
      import static org.mockito.Mockito.verify;
      
      verify(mockObject, atLeast(2)).someMethod("was called at least twice");
      verify(mockObject, times(3)).someMethod("was called exactly three times");
      

      【讨论】:

      • 谢谢,但我无法创建对象。这是一个静态方法,需要像 Util.test() 一样调用,
      • 通常你不会模拟静态方法。你只是假设它们工作正常。
      【解决方案3】:

      我没有上下文建议重构您的设计以摆脱静态方法,或者根据您的用例是否合适。

      但是,您可以使用 mockito-inline 模拟并验证已调用静态方法。这是一个满足您需要的最小测试:

      @Test
      public void actionShouldCallUtilTest() {
          try (MockedStatic<Util> mockedStatic = mockStatic(Util.class)) {
              // given
              Action action = new Action();
      
              // when
              action.update();
      
              // then
              mockedStatic.verify(Util::test);
          }
      }
      

      查看MockedStatic 文档以了解其功能。 https://javadoc.io/static/org.mockito/mockito-core/4.3.1/org/mockito/MockedStatic.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多