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

时间:2015-08-25 05:09:34

标签: java unit-testing testng powermockito

我有一个我试图模拟测试的库...有一个带有静态方法实现的Java 8接口:

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

我正试图模仿返回的值:

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

但是当我通过调试器运行测试时,不会返回模拟实例。

我尝试了静态模拟的许多不同的排列,但是我无法获得静态方法来返回我的模拟值。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

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

注意:好消息是Javassist中的问题已经修复:

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

答案 1 :(得分:0)

为什么不把它包装在你可以模拟的抽象中呢?

class RouterFactory {

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

并在课堂上使用

class YourClass {
private final RouterFactory routerFactory;

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

void doSth() {
   // do sth    
}

}

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