如何使用jmockit从模拟类中调用实际方法

时间:2017-04-27 20:53:18

标签: java junit jmockit

假设我使用MockLoginHelper模拟了一个jmockit课程。我想改变方法getSDKConfig之一的行为。在这个方法中,我想调用原始的LoginHelper.relogin。我的日食认为下面relogin();未定义。那么,我如何从模拟类中调用一个真正的方法呢?

class MockLoginHelper extends MockUp<LoginHelper> {
    @Tested
    private SDKConfiguration config;

    @Mock
    public SDKConfiguration getSDKConfig() {
        System.out.println("");
        System.out.println("Mocked " + this.getClass().getSimpleName());
        if (config == null) {
            try {
                relogin();
            } catch (Exception e) {
                System.err.println("failed to relogin");
                e.printStackTrace();
            }
        }
        return config;
    }
}

1 个答案:

答案 0 :(得分:1)

Java编译器正确地认为relogin方法不在您的模拟类中,因为MockLoginHelper扩展了MockUp类,而不是LoginHelper类。你有两个选择。如果你想实际调用LoginHelper的实际实现,那么你需要实例化一个新实现:

class MockLoginHelper extends MockUp<LoginHelper> {
    @Tested
    private SDKConfiguration config;

    @Mock
    public SDKConfiguration getSDKConfig() {
        System.out.println("");
        System.out.println("Mocked " + this.getClass().getSimpleName());
        if (config == null) {
            try {
                LoginHelper helper = new LoginHelper();
                helper.relogin();
            } catch (Exception e) {
                System.err.println("failed to relogin");
                e.printStackTrace();
            }
        }
        return config;
    }
}

否则,您可以选择执行模拟实现并调用该模拟:

class MockLoginHelper extends MockUp<LoginHelper> {
    @Tested
    private SDKConfiguration config;

    @Mock
    public void relogin() {}

    @Mock
    public SDKConfiguration getSDKConfig() {
        System.out.println("");
        System.out.println("Mocked " + this.getClass().getSimpleName());
        if (config == null) {
            try {
                relogin();
            } catch (Exception e) {
                System.err.println("failed to relogin");
                e.printStackTrace();
            }
        }
        return config;
    }
}