Powermock:静态接口方法提供未完成的存根异常

时间:2015-06-28 09:37:04

标签: java junit interface static powermock

我想用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。

在处理静态(或默认)接口方法时是否需要应用任何特殊规则或命令?

1 个答案:

答案 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 answerthis one