の外で私はcom.google.appengine.api.ThreadManager
に、次の呼び出しを行うJUnitの(4.10)ユニットテスト書いている:このテストを実行すると、私はNullPointerException
が内からスローされますテストGoogle App EngineのThreadManager GAE
ThreadManager.currentRequestThreadFactory();
をこの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
のソースをプルダウン、及び(NPEの源である)ライン39を見ると、私は次を参照してください。
public static ThreadFactory currentRequestThreadFactory() {
return (ThreadFactory) ApiProxy.getCurrentEnvironment().getAttributes()
.get(REQUEST_THREAD_FACTORY_ATTR);
}
したがって、ApiProxy.getCurrentEnvironment()
がnullであると思われ、getAttribute()
メソッドが呼び出されると、NPEがスローされます。私はGAEは、すべてのサービスのために、「テスト版」を提供することを漠然と意識してる
if(ApiProxy.getCurrentEnvironment() == null)
System.out.println("Environment is null.");
が、することができていない:私は私のユニットテストコードに高いいくつかの新しいprint文を追加することで、これを確認しましたどのようにそれらを使用し、それらを設定するか(特に)を見つける。だから私は尋ねる:GAEはそのようなテストバージョンを提供していますか?その場合は、ここにApiProxy
テストバージョンを追加するにはどうすればよいですか?そうでなければ、私の選択肢は何ですか?どちらの方法も模倣できるとは思わない(ThreadManager#currentRequestThreadFactory
またはApiProxy#getCurrentEnvironment
)。前もって感謝します。
を編集します。appengine-testing.jar
がSDKに同梱されています。このJARの内部には、ががNPEを投げずに動作するJUnitテストで使用できるApiProxy
のバージョンであると信じているApiProxyLocal.class
があります。それが事実なら(これは私も確信していません)、問題は次のようなものです。このテストに私のThreadManager
をどうやって注入するのですか?
あなたがhttps://developers.google.com/appengine/docs/java/tools/localunittesting#Introducing_the_Java_Testing_Utilitiesを読みましたか? – NamshubWriter
もう一度ありがとう - これらのテストJAR(その記事で参照されている)は、ローカルの** servce **クラスとメソッドにアクセスできますが、 'ThreadManager'のテストバージョンではありません... – IAmYourFaja