0
class A {
   public static int f1() {
      return 1;
   }
   
   public static int f2() {
      return A.f1();
   }
}

class ATest {
   @Test
   void testF2() {
      try (MockedStatic<A> aStatic = Mockito.mockStatic(A.class)) {
         aStatic.when(A::f1).thenReturn(2);
         int ret = A.f2(); // getting 0 here
         assertEquals(ret, 2);
      } catch(Exception e) {
      
      }
   }
}

在 testF2 中,我想测试静态函数 A::f2()。

它在内部调用了另一个静态函数 A::f1()。

我做了存根 A::f1() 使用“MockedStatic”和“when”方式返回 2。

但它不起作用,它返回 0。

如何解决?

4

1 回答 1

0

我认为您错过了指定模拟行为:

class ATest {
  @Test
  void testF2() {
    try (MockedStatic<A> aStatic = Mockito.mockStatic(A.class)) {
        aStatic.when(A::f1).thenReturn(2);
        aStatic.when(A::f2).thenReturn(A.f1()); // <- added this
        int ret = A.f2(); // getting 0 here
        Assertions.assertEquals(ret, 2);
    } catch (Exception e) {

    }
  }
}

A.f2()通过告诉模拟在调用时要做什么,测试运行良好。

更新:
模拟做你告诉他们的事情,如果你不告诉当一个方法被调用时做什么,他们什么也不做,这就是你必须模拟的原因f2

你想测试A,然后嘲笑它不是你的朋友。我通常使用 aMockito.spy()来部分模拟我的测试对象(你想模拟f1但 test f2,我认为spy这里不适用,因为没有实例可以监视..

我建议您尽可能重新安排A避免使用静态方法或使用可以模拟的参数。

于 2022-03-04T08:21:37.117 回答