Powermock-издевательство над вызовом супер метода
Вот мой код -
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());
}
}
Я хотел бы поиздеваться над супер.save () в классе ChildService. Но я не могу найти способ сделать это. SuppressMethod только подавляет и возвращает значение по умолчанию (0 в приведенном выше случае). И такие вещи, как MemberModifier, Stubber, MethodProxy работают только для статических методов.
Есть ли способ сделать это в Powermock?Я использую Powermock 1.5 и Mockito 1.9.5.
1 ответ:
Похоже, что jMockit может сделать то, что мне нужно. Может быть, я отправлю этот вопрос в список рассылки powermock. Между тем внизу должно хватить. пакет learning_mocking_tools.learning_mocking_tools; пакет 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(); } }