我编写了一个 JUnit (4.10) 单元测试,它对以下内容进行了调用com.google.appengine.api.ThreadManager
:
ThreadManager.currentRequestThreadFactory();
当这个测试运行时,我NullPointerException
从这个currentRequestThreadFactory
方法中被抛出:
Caused by: java.lang.NullPointerException
at com.google.appengine.api.ThreadManager.currentRequestThreadFactory(ThreadManager.java:39)
at com.myapp.server.plumbing.di.BaseModule.providesThreadFactory(BaseModule.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
当我拉下 的源代码ThreadManager
并查看第 39 行(这是 NPE 的源代码)时,我看到:
public static ThreadFactory currentRequestThreadFactory() {
return (ThreadFactory) ApiProxy.getCurrentEnvironment().getAttributes()
.get(REQUEST_THREAD_FACTORY_ATTR);
}
所以看起来ApiProxy.getCurrentEnvironment()
是null,当它的getAttribute()
方法被调用时,NPE被抛出。我已经通过在我的单元测试代码中添加一些新的打印语句来确认这一点:
if(ApiProxy.getCurrentEnvironment() == null)
System.out.println("Environment is null.");
我隐约知道 GAE 为其所有服务提供“测试版本”,但无法(特别是)找到如何使用和设置它们。所以我问:GAE 是否提供这样的测试版本?如果是这样,我如何ApiProxy
在此处添加测试版本?如果没有,那我有什么选择?我认为我不能模拟任何一种方法(ThreadManager#currentRequestThreadFactory
或ApiProxy#getCurrentEnvironment
),因为它们都是静态的。提前致谢。
编辑:我看到appengine-testing.jar
SDK 附带了一个。在这个 JAR 里面是一个ApiProxyLocal.class
我相信可以在 JUnit 测试期间使用的版本,ApiProxy
它可以在不抛出 NPE 的情况下工作。如果是这种情况(我什至不确定),那么问题是:我如何将它注入我ThreadManager
的测试中?