我想用Powermock模拟一个静态接口方法。 这是界面:
default
这是使用threadSleep的类:
import myModuleDefault, * as myModule from 'my-module';
最后是测试类:
public interface IConcurrentUtil {
static void threadSleep(final long millis) {
try {
Thread.sleep(millis);
} catch (final InterruptedException e) {
;
}
}
}
Powermock会出现此错误:
public class ConcurrentUser {
public void callInterfaceMethod() {
IConcurrentUtil.threadSleep(3000L);
}
}
我正在使用PowerMock 1.6.2和JUnit 4.12。
在处理静态(或默认)接口方法时是否需要应用任何特殊规则或命令?
答案 0 :(得分:3)
实际上在你的情况下,你不需要进行存根,因为mockStatic已经为你做了这个,它只是多余的。
因此,以下方法可行:
@RunWith(PowerMockRunner.class)
@PrepareForTest(IConcurrentUtil.class)
@PowerMockIgnore("javax.management.*")
public class ConcurrentUtilTest {
private ConcurrentUser concurrentUser;
@Before
public void setUp() {
concurrentUser = new ConcurrentUser();
}
@Test
public void testThreadSleepCallsSleepCorrect() throws Exception {
PowerMockito.mockStatic(IConcurrentUtil.class);
concurrentUser.callInterfaceMethod();
PowerMockito.verifyStatic(Mockito.times(1));
IConcurrentUtil.threadSleep(3000L);
}
}
但是如果你确实想要做一些存根,这里有一个适用于你正在使用的版本的例子:
PowerMockito.mockStatic(FileUtils.class, Answers.CALLS_REAL_METHODS.get());
PowerMockito.doThrow(new IOException()).when(FileUtils.class, "copyFile", any(File.class), any(File.class));
这里,我使用2-args mockStatic签名,因为我想做部分存根:在FileUtils类上调用真正的方法,除非我将其存根,就像我在第二行中那样。如果您不介意使用默认答案记录所有静态方法,您也可以使用1-arg版本。
您还可以查看this answer和this one。