Powermock 在静态方法调用中尝试模拟静态方法调用时调用初始方法
Powermock invokes initial method when trying to mock static method call within static method call
Powermock 不模拟静态方法调用而是在 then() 语句中调用初始方法有什么原因吗?
这是我有一系列方法调用的情况:
TestClass方法 -调用-> Class1方法 -调用-> Class2静态方法 -call-> Class3 静态方法 -call-> Class4 方法.
Class4 方法尝试查找上下文中不存在的对象并挂起,因此我尝试使用 Powermock 模拟 public 静态 Class3 方法。
所有 类 和方法都是非最终的。
我使用 TestNg。我的 testMethod 有一个 @PrepareForTest
我尝试了以下方法来模拟方法调用:
PowerMockito.mockStatic(Class3.class);
when(Class3.callEvilMethod()).thenReturn("test");
OR 而不是 when-thenReturn:
doReturn("test").when(Class3.callEvilMethod());
或
doAnswer(new Answer() {methos that returns test"}).when(Class3.callEvilMethod());
或
PowerMockito.stub(PowerMockito.method(Class3.class, "callEvilMethod")).toReturn("test");
但是当我 运行 测试时,初始 Class3.callEvilMethod() 在 when 语句中被调用。我不知道为什么。不应该被嘲笑吗?
编辑:我调整了测试以向您展示它的样子:
@PrepareForTest( { Class1.class, Class2.class, Class3.class})
public class TestClass extends AbstractTest {
private Class1 class1;
@BeforeMethod
public void setUp() throws Exception {
class1 = new Class1() {
}
@Test
public void testMethod() throws Exception {
// Create various objects in Db, do other method calls, then:
PowerMockito.mockStatic(Class3.class);
// PowerMockito.suppress(PowerMockito.method(Class3.class, "evilMethod"));
// PowerMockito.when(Class3.EvilMethod()).thenReturn("test");
// doReturn("test").when(Class3.evilMethod());
// PowerMockito.stub(PowerMockito.method(Class3.class, "evilMethod")).toReturn("test");
class1.callMethod();
}
}
好的,应该解决问题但在我的测试中遗漏的是:
@ObjectFactory
public IObjectFactory setObjectFactory() {
return new PowerMockObjectFactory();
}
或者简单地继承自 PowerMockTestCase
Powermock 不模拟静态方法调用而是在 then() 语句中调用初始方法有什么原因吗?
这是我有一系列方法调用的情况:
TestClass方法 -调用-> Class1方法 -调用-> Class2静态方法 -call-> Class3 静态方法 -call-> Class4 方法.
Class4 方法尝试查找上下文中不存在的对象并挂起,因此我尝试使用 Powermock 模拟 public 静态 Class3 方法。
所有 类 和方法都是非最终的。 我使用 TestNg。我的 testMethod 有一个 @PrepareForTest 我尝试了以下方法来模拟方法调用:
PowerMockito.mockStatic(Class3.class);
when(Class3.callEvilMethod()).thenReturn("test");
OR 而不是 when-thenReturn:
doReturn("test").when(Class3.callEvilMethod());
或
doAnswer(new Answer() {methos that returns test"}).when(Class3.callEvilMethod());
或
PowerMockito.stub(PowerMockito.method(Class3.class, "callEvilMethod")).toReturn("test");
但是当我 运行 测试时,初始 Class3.callEvilMethod() 在 when 语句中被调用。我不知道为什么。不应该被嘲笑吗?
编辑:我调整了测试以向您展示它的样子:
@PrepareForTest( { Class1.class, Class2.class, Class3.class})
public class TestClass extends AbstractTest {
private Class1 class1;
@BeforeMethod
public void setUp() throws Exception {
class1 = new Class1() {
}
@Test
public void testMethod() throws Exception {
// Create various objects in Db, do other method calls, then:
PowerMockito.mockStatic(Class3.class);
// PowerMockito.suppress(PowerMockito.method(Class3.class, "evilMethod"));
// PowerMockito.when(Class3.EvilMethod()).thenReturn("test");
// doReturn("test").when(Class3.evilMethod());
// PowerMockito.stub(PowerMockito.method(Class3.class, "evilMethod")).toReturn("test");
class1.callMethod();
}
}
好的,应该解决问题但在我的测试中遗漏的是:
@ObjectFactory
public IObjectFactory setObjectFactory() {
return new PowerMockObjectFactory();
}
或者简单地继承自 PowerMockTestCase