使用Volley和Dagger获得Robolectric ShadowApplication时的NPE

时间:2013-06-09 09:19:56

标签: android robolectric dagger android-volley

在我的Android应用程序中,我设置了Volley。

Robolectric.application已初始化,所有其他测试均可顺利运行。 尝试获取模拟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 个答案:

答案 0 :(得分:-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() {
}

答案 1 :(得分:-2)

另一种解决方法是通过调用

禁用Volley日志记录
VolleyLog.DEBUG = false;

在你的setUp方法中。