PowerMock,模拟一个静态方法,然后在所有其他静态上调用真实方法

2022-09-01 00:04:57

我正在设置模拟类的静态方法。我必须在带注释的 JUnit 设置方法中执行此操作。@Before

我的目标是将类设置为调用实际方法,除了那些我显式模拟的方法。

基本上:

@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class);

  // mock out certain methods...
  when(StaticUtilClass.someStaticMethod(anyString())).thenReturn(5); 

  // Now have all OTHER methods call the real implementation???  How do I do this?
}

我遇到的问题是,不幸的是,在方法中会抛出一个if,并提供一个值。StaticUtilClasspublic static int someStaticMethod(String s)RuntimeExceptionnull

因此,我不能简单地走调用真实方法作为默认答案的明显路线,如下所示:

@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods

  // The below call to someStaticMethod() will throw a RuntimeException, as the arg is null!
  // Even though I don't actually want to call the method, I just want to setup a mock result
  when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); 
}

我需要设置默认的 Answer,以便在模拟我感兴趣的方法的结果调用所有其他静态方法的真实方法。

这可能吗?


答案 1

你在寻找什么叫做部分嘲笑

在PowerMock中,您可以使用mockStaticPartial方法。

在PowerMockito中,您可以使用stubbing,它将仅存根定义的方法,而保留其他不变:

PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5);

也不要忘记

@PrepareForTest(StaticUtilClass.class)

答案 2

虽然我迟到了,但是我们可以通过显式指定来实现部分模拟并覆盖模拟对象的默认行为。

下面的示例演示了在行为未显式定义的情况下,我们如何调用实际方法:PowerMockito

例如:PowerMockito.mockStatic(MyClass.class, new CallsRealMethods());


推荐