次の呼び出しを行う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がスローされます。これを確認するために、ユニットテストコードの上位にいくつかの新しいprintステートメントを追加しました。
if(ApiProxy.getCurrentEnvironment() == null)
System.out.println("Environment is null.");
GAEがすべてのサービスの「テストバージョン」を提供していることを漠然と認識していますが、それらの使用方法と設定方法を(具体的に)見つけることができていません。だから私は尋ねます:GAEはそのようなテストバージョンを提供していますか?もしそうなら、どうすればApiProxy
ここにテストバージョンを追加できますか?そうでない場合、私のオプションは何ですか?どちらの方法(または)も静的であるため、どちらの方法(ThreadManager#currentRequestThreadFactory
または)もモックできないと思います。ApiProxy#getCurrentEnvironment
前もって感謝します。
編集:appengine-testing.jar
SDKに同梱されているものがあるようです。このJARの中には、JUnitテスト中に使用できるバージョンであり、NPEをスローしなくても機能するApiProxyLocal.class
と私は信じています。ApiProxy
それが事実である場合(私は確信が持てませんが)、問題は次のとおりです:ThreadManager
このテストのためにそれを自分に注入するにはどうすればよいですか?