Powermock-模拟超级方法调用 [英] Powermock - mocking a super method invocation
问题描述
这是我的代码-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.core.classloader.annotations.*;
import static org.powermock.api.support.SuppressCode.*;
class BaseService {
public int save() {
validate();
return 2;
}
public static int save2() {
return 5;
}
public void validate() {
System.out.println("base service save executing...");
}
}
class ChildService extends BaseService {
public int save() {
System.out.println("child service save executing...");
int x = super.save2();
int y = super.save();
System.out.println("super.save returned " + y);
load();
return 1 + x;
}
public void load() {
System.out.println("child service load executing...");
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(BaseService.class)
public class PreventSuperInvocation {
@Test
public void testSave() throws Exception {
org.powermock.api.support.Stubber.stubMethod(BaseService.class,
"save2", 4);
suppressMethod(BaseService.class, "save");
ChildService childService = new ChildService();
System.out.println(childService.save());
}
}
我想在ChildService
类中模拟super.save()
.但是我找不到做到这一点的方法. suppressMethod()
仅禁止并返回默认值(上述情况下为0).而且MemberModifier
,Stubber
,MethodProxy
之类的东西仅适用于静态方法.
I would like to mock super.save()
in ChildService
class. But I can't find a way of doing it. suppressMethod()
only suppresses and returns a default value (0 in the above case). And things like MemberModifier
, Stubber
, MethodProxy
only work for static methods.
在Powermock中可以做到这一点吗?
Is there a way of doing this in Powermock?
我正在使用Powermock 1.5和Mockito 1.9.5.
I'm using Powermock 1.5 and Mockito 1.9.5.
推荐答案
看来jMockit可以满足我的需要.也许我可以将这个问题发布到powermock邮件列表中.同时下面就足够了. 包learning_mocking_tools.learning_mocking_tools; 包learning_mocking_tools.learning_mocking_tools;
It seems that jMockit can do what I need. Maybe I will I post this question to the powermock mailing list. Meanwhile below should suffice. package learning_mocking_tools.learning_mocking_tools; package learning_mocking_tools.learning_mocking_tools;
import mockit.*;
import org.junit.Assert;
import org.junit.Test;
class BaseService {
public int save() {
validate();
return 2;
}
public static int save2() {
return 5;
}
public void validate() {
System.out.println("base service save executing...");
}
}
class ChildService extends BaseService {
public int save() {
System.out.println("child service save executing...");
int x = super.save2();
int y = super.save();
System.out.println("super.save returned " + y);
load();
return 1 + y;
}
public void load() {
System.out.println("child service load executing...");
}
}
@MockClass(realClass = BaseService.class)
class MockBase {
@Mock
public int save() {
System.out.println("mocked base");
return 9;
}
}
public class PreventSuperInvocation {
@Test
public void testSave() throws Exception {
MockBase mockBase = new MockBase();
Mockit.setUpMock(BaseService.class, mockBase);
ChildService childService = new ChildService();
// int x = childService.save();
Assert.assertEquals(9 + 1, childService.save());
Mockit.tearDownMocks();
}
}
这篇关于Powermock-模拟超级方法调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!