让 PowerMockito 模拟接口上的静态方法?

Getting PowerMockito to mock a static method on an Interface?

我有一个库,我正在尝试模拟它以进行测试...有一个 Java 8 接口,带有这样的静态方法实现:

public interface Router {
    public static Router router(Object param) {
        return new RouterImpl(param);
    }
}

我正在尝试模拟 returned 值:

PowerMockito.mockStatic(Router.class);
PowerMockito.doReturn(mockRouter).when(Router.router(any()));

但是当我 运行 通过调试器进行测试时,模拟实例未 returned。

我已经尝试了多种不同的静态模拟排列,但我无法将静态方法获取到 return 我的模拟值。有什么想法吗?

为什么不将其包装在您可以模拟的抽象中?

class RouterFactory {

    Router createRouter(Object param) {
        return Router.router(param);
    }
}

并在您的 class

中使用它
class YourClass {
private final RouterFactory routerFactory;

YourClass(RouterFactory routerFactory) {
this.routerFactory = routerFactory;
}

void doSth() {
   // do sth    
}

}

然后你就可以毫无问题地模拟 RouterFactory 并且你不必使用 Powermock。

你做的是对的,但是当在 PowerMock 中模拟静态接口方法是 implemented/fixed 时,我们将不得不等待。观看此拉取请求: https://github.com/jayway/powermock/issues/510

注意:好消息是 Javassist 中的问题已经解决:

https://github.com/jboss-javassist/javassist/pull/11