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());
    }
}

我想在ChildService课上模仿super.save()。但我找不到一个方法。suppressMethod()只抑制并返回默认值(在上述情况下为0)。像MemberModifier, Stubber, MethodProxy这样的东西只适用于静态方法。

在Powermock中有这样做的方法吗?

我使用的是Powermock 1.5和Mockito 1.9.5。

似乎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();
    }
}

相关内容

  • 没有找到相关文章

最新更新