java - PowerMockito 模拟单个静态方法并返回对象

标签 java jakarta-ee mockito easymock powermock

我想从一个包含 2 个静态方法 m1 和 m2 的类中模拟一个静态方法 m1。我希望方法 m1 返回一个对象。

我尝试了以下

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

这同时调用了 m1 和 m2,它们具有不同的返回类型,因此它给出了返回类型不匹配错误。

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); 但是在执行 m1 时不会调用它。

3) PowerMockito.mockPartial(Static.class, "m1"); 给出 mockPartial 不可用的编译器错误,我从 http://code.google.com/p/powermock/wiki/MockitoUsage 得到.

最佳答案

您想要做的是 1 的一部分和 2 的全部组合。

您需要使用 PowerMockito.mockStatic 为类的所有静态方法启用静态模拟。这意味着可以使用 when-thenReturn 语法对它们进行 stub 。

但是,您使用的 mockStatic 的 2 参数重载为 Mockito/PowerMock 在调用未在模拟实例上显式 stub 的方法时应该执行的操作提供了默认策略。

来自 javadoc :

Creates class mock with a specified strategy for its answers to interactions. It's quite advanced feature and typically you don't need it to write decent tests. However it can be helpful when working with legacy systems. It is the default answer so it will be used only when you don't stub the method call.

默认默认 stub 策略是只为对象、数字和 boolean 值方法返回 null、0 或 false。通过使用 2-arg 重载,您是在说“不,不,不,默认情况下使用这个 Answer 子类的回答方法来获取默认值。它返回一个 Long,所以如果你有静态方法返回不兼容的东西长,有问题。

相反,使用 1-arg 版本的 mockStatic 来启用静态方法的 stub ,然后使用 when-thenReturn 指定对特定方法执行的操作。例如:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

String 值静态方法被 stub 返回“Hello!”,而 int 值静态方法使用默认 stub ,返回 0。

关于java - PowerMockito 模拟单个静态方法并返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10583202/

相关文章:

java - 为什么 LinkedHashSet 的 boolean accessOrder 设置为 false

java - Mockito:如何验证一个方法只被调用一次,使用精确的参数忽略对其他方法的调用?

java - MPI Recv 数据损坏

java - 从Java线程池中删除空闲线程?

java - 如何制作过滤器以检测用户是否请求了未找到的页面?

java - 多次向每个项目添加jar文件

java - 有没有办法以表格形式或单独的应用程序查看 Netbeans 开发输出?

junit - 在 Junit Mockito 中传递具有添加属性的对象

java - 匹配测试下方法内部创建的 HttpGet 对象

java - 如何删除 java.util.Set 中的最后一个元素?