【问题标题】:How to mock specific static method in a java class?如何在java类中模拟特定的静态方法?
【发布时间】:2026-02-18 15:50:01
【问题描述】:

在我的测试类中有许多静态方法,但我只想模拟测试类的特定方法。

有什么方法可以让我仅模拟特定方法,而静态方法的其余部分正常运行?

以及如何为特定值存根方法

假设这是我的方法 PowerMockito.stub(PowerMockito.method(ServiceUtils.class, "getBundle",String.class)).toReturn(bundle);

我希望 getBundle 方法对传递的不同争论有不同的表现 例如:字符串可以是 abc 或 def ,因此对于每个字符串,getbundle 方法的行为应该不同。

我只是希望有什么方法可以代替 PowerMockito.method 中的 String.class 我可以传递像“abc”这样的值。

【问题讨论】:

    标签: java junit mockito powermockito


    【解决方案1】:

    您可以创建真实对象的间谍。当您使用 spy 时,会调用真正的方法(除非方法被存根)。

    这是官方文档中的一个示例。

    List list = new LinkedList();
    List spy = spy(list);
    
    //optionally, you can stub out some methods:
    when(spy.size()).thenReturn(100);
    
    //using the spy calls *real* methods
    spy.add("one");
    spy.add("two");
    
    //prints "one" - the first element of a list
    System.out.println(spy.get(0));
    
    //size() method was stubbed - 100 is printed
    System.out.println(spy.size());
    
    //optionally, you can verify
    verify(spy).add("one");
    verify(spy).add("two");
    

    【讨论】:

      【解决方案2】:

      你可以这样做(如果你使用 mokito)

       when(mockedList.get(0)).thenReturn("first");
      

      【讨论】: