如果我根本无法安全地调用该方法,如何设置最终方法的期望? 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的重点是让这成为可能吗?
答案 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的内部调用。