PowerMockito模拟单个静态方法和返回对象

ruoxqz4g  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(68)

我想从一个包含两个静态方法m1和m2的类中模拟一个静态方法m1。我想让方法m1返回一个对象。
我尝试了以下方法
第一章

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

字符串
这是同时调用m1和m2,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得到的。

ybzsozfc

ybzsozfc1#

你要做的是1的一部分和2的全部的组合。
你需要使用PowerMockito.mockStatic来为一个类的所有静态方法启用静态模拟。这意味着使用when-thenReturn语法来存根它们是**可能的。
但是,您正在使用的mockStatic的2参数重载提供了一个默认策略,当您调用一个没有显式地在mock示例上存根的方法时,Mockito/PowerMock应该做什么。
javadoc
使用指定的策略创建类mock来回答交互。这是一个非常高级的功能,通常你不需要它来编写像样的测试。但是当使用遗留系统时,它会很有帮助。它是默认答案,所以只有当你不存根方法调用时才会使用它。

default默认的重载策略是只返回null,0或false对象,数字和布尔值方法。通过使用2-arg重载,你说“不,默认情况下使用这个Answer子类的answer方法来获取默认值。它返回一个Long,所以如果你有静态方法返回与Long不兼容的东西,那就有问题了。

相反,使用mockStatic的1-arg版本来启用静态方法的重写,然后使用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值的静态方法被存根化以返回“Hello!",而int值的静态方法使用默认的存根化,返回0。

z5btuh9x

z5btuh9x2#

我使用String静态方法创建了一个单元测试:

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(String.class)
public class PowerMockTest {

    @Test
    public void staticMethodMocking() {
        PowerMockito.mockStatic(String.class);
        PowerMockito.when(String.valueOf(false)).thenReturn("true");
        Assert.assertEquals("true", String.valueOf(false));
    }

}

字符串

相关问题