Powermock / EasyMock:设置会导致异常的最终方法的期望值

时间:2014-12-11 10:48:07

标签: java final powermock easymock

如果我根本无法安全地调用该方法,如何设置最终方法的期望? PowerMock应该确保调用被模拟,但我甚至无法进入那个阶段:

WithFinal.java:

public class WithFinal {
    public final void finalMethod() {
        throw new RuntimeException();
    }
}

CallsFinal.java:

public class CallsFinal {
    private WithFinal withFinal;

    public CallsFinal(WithFinal withFinal) {
        this.withFinal = withFinal;
    }

    public void callFinal() {
        withFinal.finalMethod();
    }
}

PowerMockTest.java:

import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.core.classloader.annotations.PrepareForTest;

import static org.powermock.api.easymock.PowerMock.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest(CallsFinal.class)
public class PowerMockTest {
    @Test public void testFinal() {
        WithFinal mock = createMock(WithFinal.class);
        CallsFinal callsFinal = new CallsFinal(mock);
        mock.finalMethod();
        EasyMock.expectLastCall().atLeastOnce();
        replay(mock);
        callsFinal.callFinal();
        verify(mock);
    }
}

我在第一次调用RuntimeException时得到mock.finalMethod(),这是有道理的,但我认为PowerMock的重点是让这成为可能吗?

2 个答案:

答案 0 :(得分:1)

测试类中有一个简单的错误:它应该是@PrepareForTest(CallsFinal.class)而不是@PrepareForTest(WithFinal.class)

PowerMock仅要求在从JRE模拟系统类时准备调用类进行测试;否则,它就是要被嘲笑的类,需要做好准备。

最后,我会提到另一个可以在这里使用的模拟库,我碰巧开发了它:JMockit。有了它,测试可以写成:

import org.junit.*;
import mockit.*;

public class JMockitTest {
    @Tested CallsFinal callsFinal;
    @Injectable WithFinal mock;

    @Test public void testFinal() {
        new Expectations() {{ mock.finalMethod(); }};

        callsFinal.callFinal();
    }
}

答案 1 :(得分:0)

使用PowerMock,您可以模拟跳过内部方法调用而不是直接方法调用。

例如,您要测试CallsFinal类的callFinal方法,该方法在内部调用WithFinal类的finalMethod。因此,在这种情况下,如果您不想实例化WithFinal类,则需要模拟WithFinal对象以跳过对finalMethod的内部调用。