通过改造RestAdapter创建并通过Dagger2注入的模拟Web服务

时间:2015-08-27 13:50:51

标签: android unit-testing retrofit dagger-2

我正在使用Retrofit并通过Dagger2注入RestAdapterWebService类/接口

在测试中,我模仿我的网络服务类为MockWebService200 implements WebService,我从Retrofit

获取此例外
java.lang.IllegalArgumentException: Only interface endpoint definitions are supported.
        at retrofit.Utils.validateServiceClass(Utils.java:102)
        at retrofit.RestAdapter.create(RestAdapter.java:193)

这是WebService的接口类

public interface WebService {

@FormUrlEncoded
@POST("/loginByEmail")
void loginByEmail (@Field("emailaddress") String email,
                   @Field("password") String password,
                   @Field("checksum") String checksum,
                   Callback<ServiceModel<User>> callback);
}

而且,这是我的MockWebService200班级

public class MockWebService200 implements WebService {
    @Override
    public void loginByEmail (@Field("emailaddress") String email,
                          @Field("password") String password,
                          @Field("checksum") String checksum,
                          Callback<ServiceModel<User>> callback) {
    ServiceModel<User> userModel = getServiceModel( getUser() );
    callback.success( userModel, null );
    }

    @Override public <T> ServiceModel<T> getServiceModel (T model) {
        // Skipped
    }

    @Override public User getUser () {
    // Skipped
    }
    }

getUser()getServiceModel()将在此处跳过。

以下是提供依赖关系的@module的代码

@Module
@Singleton
public class ApiModule {
    @Provides
    @Singleton RestAdapter provideRestAdapter () {
        RestAdapter.Builder builder = new RestAdapter.Builder()
                .setEndpoint( "some_url" )
                .setClient( /*OkHttpClient*/ );

        return builder.build();
    }

    @Provides
    @Singleton WebService provideWebService (RestAdapter restAdapter) {
        return restAdapter.create( MockWebService200.class );
    }
}

问题:

1-如何解决这个问题?

2-我的方法是否正确通过多态来模拟Web服务以及我可以在这里使用哪些替代方案?

1 个答案:

答案 0 :(得分:0)

你不能要求RestAdapter实现一个类,因为类的实现。您必须在测试中使用构造函数单独实例化它,可能只是空构造函数。因此,您只需使用Dagger创建自己的实例,而不是通过new MockWebService200()注入它。不过,你也必须实现getServiceModel()