如果根本无法安全地调用该方法,该如何对最终方法设置期望? 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/