将MockWebServer与Robolectric一起使用

tof*_*ffe 6 junit robolectric retrofit mockwebserver

我正在尝试使用MockWebServer和Robolectric对一些API调用进行单元测试.

我的测试类注释为:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 23)
Run Code Online (Sandbox Code Playgroud)

但是,在尝试构建Retrofit实例时,我得到以下异常:

java.lang.NullPointerException
    at android.os.Handler.__constructor__(Handler.java:229)
    at android.os.Handler.<init>(Handler.java)
    at retrofit2.Platform$Android$MainThreadExecutor.<init>(Platform.java:105)
    at retrofit2.Platform$Android.defaultCallbackExecutor(Platform.java:97)
    at retrofit2.Retrofit$Builder.build(Retrofit.java:556)
Run Code Online (Sandbox Code Playgroud)

我用来构建改造实例的代码:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(mMockServer.url(""))
                .addConverterFactory(GsonConverterFactory.create())
                .build();
Run Code Online (Sandbox Code Playgroud)

上面的例外是在打电话时返回的.build().

我该如何解决这个问题?

Nic*_*oso 6

我有同样的问题.有一个关于根本原因打开一个bug 在这里,但是,而正在进行中,我决定使用Robolectric 3.0和戴夫-R12描述的解决方案在这里这是创建以下列出一些模拟.

@RunWith(RobolectricGradleTestRunner.class)
@Config(shadows = CreateOkHttpClientTest.MyNetworkSecurityPolicy.class)
public class CreateOkHttpClientTest {

    @Test
    ...

    @Implements(NetworkSecurityPolicy.class)
    public static class MyNetworkSecurityPolicy {

        @Implementation 
        public static NetworkSecurityPolicy getInstance() {
            try {
                Class<?> shadow = MyNetworkSecurityPolicy.class.forName("android.security.NetworkSecurityPolicy");
                return (NetworkSecurityPolicy) shadow.newInstance();
            } catch (Exception e) {
                throw new AssertionError();
            }
        }

        @Implementation 
        public boolean isCleartextTrafficPermitted() {
            return true;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)