模拟调用同一类的另一个静态方法的静态方法

5

我需要为一个静态方法编写单元测试,该方法需要模拟同一类的另一个静态方法。 示例代码:

public class A {
   public static boolean foo(){}
   public static boolean bar(){
       return foo();
   }
}

@PrepareForTest({A.class})
public ATest{
   testMethod(){
       mockStatic(A.class);
       when(A.foo()).thenReturn(true);
       assertTrue(A.bar());
   }

我一直在尝试对bar方法进行单元测试,但是到目前为止还没有成功。

问题:我的代码中调试无法达到return foo();语句,并且断言失败。请给予建议。在这个时间点我无法修改代码。

如果能帮助模拟foo方法,将不胜感激。谢谢!


1
你对PowerMock有什么具体的问题? - user3707125
1
即使您可以模拟静态方法,这实际上根本是您的代码设计不良的标志。将代码设计为进行测试,而不是相反。 - Louis Wasserman
@user3707125 我的代码中调试无法到达 return foo(); 语句,导致断言失败。请给予建议。我目前无法修改代码。 - user3233920
2个回答

6
在这种情况下,您不应该在类上创建模拟,而是仅在来自类A的特定方法(foo())上使用stub
public static <T> MethodStubStrategy<T> stub(Method method)

上述方法属于 API 中的 MemberModifier 类,它是 PowerMockito 类的父类,因此您的语法应该像这样:
PowerMockito.stub(PowerMockito.method(A.class, "foo")).toReturn(true);

记得 foo() 的参数,例如 A.class, "foo", int.class - 18446744073709551615

3

boolean的默认值为false,这个事实起到了不好的作用。你原本期望会调用错误的foo,但事实上却没有调用bar。简而言之:

when(A.bar()).thenCallRealMethod();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接