5 java google-app-engine junit unit-testing
我写了一个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.jarSDK附带了一个.在这个JAR ApiProxyLocal.class中我认为是一个ApiProxy可以在JUnit测试期间使用的版本,它可以在不抛弃NPE的情况下工作.如果是这种情况(我甚至不确定),那么问题是:我如何将它注入我ThreadManager的测试中?
我建议避免ThreadManager.currentRequestThreadFactory()直接从代码中调用。相反,将 注入ThreadFactory到需要创建线程的类中。
一种简单的方法是使用 Guice:
public static class MyService {
  private final ThreadFactory threadFactory;
  @Inject
  MyService(ThreadFactory threadFactory) {
    this.threadFactory = threadFactory;
  }
  ...
}
在您的测试中MyService,您可以将 fake 传递ThreadFactory给MyService构造函数或注入Executors.defaultThreadFactory()。
在您的生产代码中,您将创建一个绑定:
bind(ThreadFactory.class)
    .toInstance(ThreadManager.currentRequestThreadFactory());
当然,如果您还没有准备好进入依赖注入,您可以创建自己的访问器来获取和设置ThreadFactory
| 归档时间: | 
 | 
| 查看次数: | 1332 次 | 
| 最近记录: |