5

如何测试使用Android-Job库创建的作业?任何关于单元测试、仪器测试甚至手动测试的想法都值得赞赏,我只想检查它是否按预期工作。

具体来说,我有一个每 N 小时执行一次 HTTP 请求的工作:

package com.kondenko.yamblzweather.job;


import android.support.annotation.NonNull;

import com.evernote.android.job.Job;
import com.evernote.android.job.JobRequest;
import com.kondenko.yamblzweather.model.entity.WeatherData;
import com.kondenko.yamblzweather.ui.weather.WeatherInteractor;
import com.kondenko.yamblzweather.utils.SettingsManager;

import java.util.concurrent.TimeUnit;

import javax.inject.Inject;

public class UpdateWeatherJob extends Job {

private WeatherInteractor interactor;
private String cityId;
private String units;
private long refreshRateHr;

// Do not delete, needed for job creation
public static final String TAG = "UpdateWeaterJob";

@Inject
public UpdateWeatherJob(WeatherInteractor interactor, SettingsManager settingsManager) {
    this.interactor = interactor;
    this.cityId = settingsManager.getSelectedCity();
    this.units = settingsManager.getSelectedUnitValue();
    this.refreshRateHr = settingsManager.getRefreshRate();
}

@NonNull
@Override
protected Result onRunJob(Params params) {
    WeatherData data = interactor.getWeather(cityId, units).blockingGet();
    return data != null ? Result.SUCCESS : Result.FAILURE;
}


public void buildJobRequest(String name) {
    new JobRequest.Builder(UpdateWeatherJob.TAG)
            .setPeriodic(TimeUnit.HOURS.toMillis(refreshRateHr))
            .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
            .setRequirementsEnforced(true)
            .setPersisted(true)
            .build()
            .schedule();
}

}
4

1 回答 1

5

我们在 Evernote 测试工作的方式如下:

  • 单元测试 -> 我们倾向于将逻辑提取到操作中,类似于 MVP 设置中的演示者。这将删除 Android 依赖项,并且操作是可单元测试的。
  • QA -> 我们有 QA 选项可以手动触发作业。通过这种方式,我们的 QA 团队可以验证作业是否产生了正确的输出
  • 验证时间 -> 我们依赖日志。

您还应该看看这些幻灯片。亚行对验证窗帘假设非常有帮助。

于 2018-02-01T14:12:59.230 回答