如果根本无法安全地调用该方法,该如何对最终方法设置期望? 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的全部目的就是要实现这一点?

最佳答案

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

当从JRE模拟系统类时,PowerMock仅要求准备调用类以进行测试。否则,需要准备的是要嘲笑的类。

最后,我要提到的是我可以开发的另一个模拟库: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();
    }
}

关于java - Powermock/EasyMock:对将引发异常的 final方法设置期望,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27420989/

10-11 05:05