我写了一个 JUnit(4.10)单元测试,其中调用了com.google.appengine.api.ThreadManager
:
ThreadManager.currentRequestThreadFactory();
当此测试运行时,我会从
currentRequestThreadFactory
方法中抛出一个NullPointerException
: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()
为空,当调用其getAttribute()
方法时,会抛出NPE异常。我通过在我的单元测试代码中添加一些新的打印语句来确认这一点:
if(ApiProxy.getCurrentEnvironment() == null)
System.out.println("Environment is null.");
我有点意识到GAE为其所有服务提供“测试版本”,但我没有能够找到(具体)如何使用它们和设置它们的方法。所以我问:GAE是否提供这样的测试版本?如果是,我该如何在这里添加
ApiProxy
测试版?如果不是,那么我的选择是什么?我认为我不能模拟任何一种方法(ThreadManager#currentRequestThreadFactory
或ApiProxy#getCurrentEnvironment
),因为它们都是静态的。谢谢您提前。编辑:我发现SDK附带了一个
appengine-testing.jar
。在这个JAR文件中,有一个ApiProxyLocal.class
,我相信它是一个可以在JUnit测试期间使用的ApiProxy
版本,可以避免抛出NPE。如果是这样(我甚至不确定),那么问题是:我该如何将其注入到此测试的ThreadManager
中?
ThreadManager
的测试版本... - IAmYourFaja