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

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

我尝试了以下方法

(一)

PowerMockito.mockStatic(Static.class,新答案<Long>(){
@凌驾
公共长应答(invocationMock调用)抛出可丢弃的{
返回1000l;
}
});

这同时调用m1和m2,这两个函数具有不同的返回类型,因此它给出了一个返回类型不匹配错误

2) PowerMockito.when(Static.m1(param1,param2)),然后返回(1000l)
但在执行m1时不调用该函数

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

你要做的是把1的部分和2的全部结合起来

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

但是,您正在使用的mockStatic的2参数重载提供了一种默认策略,用于在调用尚未在mock实例上显式存根的方法时Mockito/PowerMock应该执行的操作

从javadoc:

使用指定的策略创建类mock,以回答
互动。这是一个非常高级的特性,通常您不需要它
编写体面的测试是非常必要的。但是,在使用时,它可能会有所帮助
遗留系统。这是默认答案,因此只有在
您不需要存根方法调用

默认的存根策略是只为object、number和boolean值方法返回null、0或false。通过使用2-arg重载,您会说“不,不,不,默认情况下,使用此Answer子类的Answer方法获取默认值。它返回一个Long,因此如果您有返回与Long不兼容的静态方法,则会出现问题

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

导入静态org.mockito.mockito.*;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.mockito.invocation.invocationMock;
导入org.mockito.stubing.Answer;
导入org.powermock.api.mockito.PowerMockito;
导入org.powermock.core.classloader.annotations.PrepareForTest;
导入org.powermock.modules.junit4.PowerMockRunner;
类与统计{
公共静态字符串getString(){
返回“字符串”;
}
公共静态int getInt(){
返回1;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
公共类StubJustOneStatic{
@试验
公开无效测试(){
mockStatic(ClassWithStatics.class);
当(ClassWithStatics.getString())。然后返回(“Hello!”);
System.out.println(“字符串:”+ClassWithStatics.getString());
System.out.println(“Int:+ClassWithStatics.getInt());
}
}

字符串值静态方法被存根为返回“Hello!,而int值静态方法使用默认存根,返回0

发表评论