/var/log/messages

Feb 27, 2018 - 2 minute read - Comments - android

DroidKaigi2018UnitTestHandsOn 実装掘削メモ

datasource/remote 配下のテストを確認するのを忘れてました。これ以外の継続? が以下です。

  • RepositoryMapper
  • RepositoryEntityMapper
  • Retrfit のあたり諸々

とりあえず試験から確認します。

GitHubInfraRepository の試験は確認しているみたいなので、GitHubRestDataSourceTest の確認になります。ここ、引用はスルーしますが setUp あたりの記述は非常に参考になります。

確認している項目としては以下なのか (検証しているのは setUp で設定しているものになっています)。

  • “srym” ユーザでリクエストした場合の結果の検証
  • “ymnder” ユーザでリクエストした場合の結果の検証
  • 未定義のユーザでリクエストした場合に ApiException が発生するかを検証

で、残を倒すのですが、とりあえず Retrofit について確認してみます。控えを以下に列挙します。

前のエントリにて GitHubRemoteDataSource なオブジェクトは GitHubInfraRepository の Factory method で生成、ということを確認してます。

        GitHubRemoteDataSource remote = new GitHubRestDataSource(
            GsonProvider.INSTANCE.get(),
            RetrofitProvider.INSTANCE.get().create(GitHubService.class)
        );

RetrofitProvider の定義は datasource/remote/service 配下。一部のみ以下に引用します。

public enum RetrofitProvider implements Singleton<Retrofit> {
  INSTANCE;

  @NonNull
  private final Retrofit instance = new Retrofit.Builder()
          .baseUrl(BuildConfig.API_BASE_URL)
          .addConverterFactory(GsonConverterFactory.create(GsonProvider.INSTANCE.get()))
          .client(OkHttpProvider.INSTANCE.get())
          .build();

  @NonNull
  @Override
  public Retrofit get() {
    return instance;
  }
}

全部でした。で、create が戻すのは GitHubService 型になります。execute してるのはどこだったかしら。GitHubRestDataSource#getUserRepositories でした。

  @NonNull
  @Override
  public List<RepositoryEntity> getUserRepositories(@NonNull String account) throws IOException, ApiException {
    Response<List<RepositoryEntity>> response = gitHubService.getUserRepositories(
        account,
        Sort.UPDATED.value,
        Direction.DESC.value
    ).execute();
    return stripResult(response);
  }

GitHubService#getUserRepositories の定義が以下。

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<RepositoryEntity>> getUserRepositories(
      @Path("user") String user,
      @Query("sort") String sort,
      @Query("direction") String direction
  );
}

引用しまくってますがご容赦願います。execute で戻るのが CALL の中身? なのか。や、違うカンジ。ここはもすこし確認必要ですね。stripResultBaseRestDataSource にて定義されていますね。あるいは式で分かるように execute の戻りは Response<List<RepositoryEntity>> 型になることがわかります。

BaseRestDataSource#stripResult の定義によれば Response<List<RepositoryEntity>>isSuccessful というメソドがあるようです。あるいは body 属性は List<RepositoryEntity> 型になる模様。

このあたり、こんなもんでしょ、って理解で良いのかな。良いことにします (を