PowerMock,模拟一个静态方法,然后在所有其他静态上调用真正的方法 [英] PowerMock, mock a static method, THEN call real methods on all other statics

查看:49
本文介绍了PowerMock,模拟一个静态方法,然后在所有其他静态上调用真正的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm setting up mocking a class' static methods. I have to do this in a @Before-annotated JUnit setup method.

我的目标是设置类来调用真正的方法,除了那些我明确模拟的方法.

My goal is to setup the class to call real methods, except for those methods I explicitly mock.

基本上:

@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?
}

我遇到的问题是,在 StaticUtilClass 中,方法 public static int someStaticMethod(String s) 不幸地抛出一个 RuntimeException 如果提供一个 null 值.

The problem I'm running into is that within StaticUtilClass the method public static int someStaticMethod(String s) unfortunately throws a RuntimeException if supplied with a null value.

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

So I can't simply go the obvious route of calling real methods as the default answer as below:

@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); 
}

我需要设置默认答案以在所有其他静态方法上调用真实方法之后我模拟了我对模拟感兴趣的方法的结果.

I need to set the default Answer to call real methods on all other static methods after I mock the results from the method I'm interested in mocking.

这可能吗?

推荐答案

你在找什么叫做partial mocking.

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

In PowerMock you can use mockStaticPartial method.

在 PowerMockito 中,您可以使用存根,它只会存根定义的方法而其他保持不变:

In PowerMockito you can use stubbing, which will stub only the method defined and leave other unchanged:

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

也不要忘记

@PrepareForTest(StaticUtilClass.class)

这篇关于PowerMock,模拟一个静态方法,然后在所有其他静态上调用真正的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆