【问题标题】:Mock web service created from retrofit RestAdapter and injected through Dagger2从改造 RestAdapter 创建并通过 Dagger2 注入的模拟 Web 服务
【发布时间】:2015-08-27 13:50:51
【问题描述】:

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

在测试中,我将我的 Web 服务类模拟为 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 服务的方法是否正确?我可以在这里使用哪些替代方法?

【问题讨论】:

  • 您是否使用RestAdapter 来实例化您的模拟类?模拟类不需要通过改造来实例化,因为您提供实现而不是改造。
  • 是的,我正在使用RestAdapter 并在其builder().create() 中提供MockWebService200.class 作为RestAdapter.builder().create(MockWebService200.class) 我将在我的问题中添加提供程序代码

标签: android unit-testing retrofit dagger-2


【解决方案1】:

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

【讨论】:

  • 我已经编辑了我的问题并提供了用于实例化RestAdapter 的代码如果我实例化一个新的RestAdapter 让我们在我的测试类中说MockedRestAdapter 如何强制我的片段使用@987654328 @?此外,getServiceModel() 在这里被跳过,因为我觉得它超出了这个问题的范围
  • 你模拟WebService的原因是你不想测试你的那部分代码;你希望它有保证的、可预测的行为。这就是您实施MockWebService200 的原因。这意味着您不应再使用RestAdapter 来创建它,因为您不想对其进行测试。所以;放弃课程中的RestAdapter 部分。在您的测试中,使用WebService mockedService = new MockWebService200() 获取WebService 的模拟版本,并使用它而不是由RestAdapter 构建的注入WebService 实现。
  • 我明白了,让我试试。好建议。
猜你喜欢
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多