2013-06-09 6 views
10

Androidアプリケーションでは、Volleyを設定しました。Robolectric ShadowApplicationをVolley and Daggerで取得するときのNPE

Robolectric.applicationが初期化され、他のすべてのテストが円滑に実行されます。 mocked HTTPレスポンスを取得しようとすると、このエラーが発生します。

これは私のテストで:

@RunWith(MyRobolectricTestRunner.class) 
public class ApiTests { 

    @Inject 
    protected Api api; 

    @Before 
    public void setUp() { 
     ObjectGraph.create(new AndroidModule(Robolectric.application), new TestApplicationModule()).inject(this); 
    } 

    @Test 
    public void shouldGetErrorList() throws Exception { 
     Project project = new Project("test", "test", "test", DateTime.now()); 
     addPendingProjectsErrorsResponse("response.json"); //adding response to FakeHttpLayer 

     api.getProjectErrors(project, new Listener<ProjectErrors>() { 
       @Override 
       public void onResponse(ProjectErrors response) { 
        assertNotNull(response); 
       } 
      }, new ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        throw new RuntimeException(error); 
       } 
      } 
     ); 
    } 
} 

これは私が取得エラーです:

Exception in thread "Thread-3" java.lang.NullPointerException 
    at org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:59) 
    at android.os.Looper.getMainLooper(Looper.java) 
    at org.robolectric.Robolectric.getUiThreadScheduler(Robolectric.java:1301) 
    at org.robolectric.shadows.ShadowSystemClock.now(ShadowSystemClock.java:15) 
    at org.robolectric.shadows.ShadowSystemClock.uptimeMillis(ShadowSystemClock.java:25) 
    at org.robolectric.shadows.ShadowSystemClock.elapsedRealtime(ShadowSystemClock.java:30) 
    at android.os.SystemClock.elapsedRealtime(SystemClock.java) 
    at com.android.volley.VolleyLog$MarkerLog.add(VolleyLog.java:114) 
    at com.android.volley.Request.addMarker(Request.java:174) 
    at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:92) 

答えて

-2

私は同じエラーを持っていたし、私自身の(醜い)SystemClockシャドウを使用してそれを避けます。

シャドウクラス:

@Implements(value = SystemClock.class, callThroughByDefault = true) 
public static class MyShadowSystemClock { 
    public static long elapsedRealtime() { 
     return 0; 
    } 
} 

テストコード:

@Test 
@Config(shadows = { MyShadowSystemClock.class, ... }) 
public void myTest() { 
} 
-2

別の回避策は、あなたのセットアップ方法で

VolleyLog.DEBUG = false; 

を呼び出すことによって、バレーボールのログを無効にすることです。

関連する問題