Как проверить асинхронный метод с использованием Mockito в Android? - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь протестировать свое приложение с помощью Mockito.Он построен с использованием шаблона MVP.Это мой контракт:

public interface CityContract {
    interface View {
        void setData(String data);
    }

    interface Presenter {
        boolean isViewAttached();
    }

    interface Model {
        void getResponse(CityModel.DataCallback callback);
    }
}

Это мой вид:

public class CityActivity extends AppCompatActivity implements CityContract.View {
    private CityPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_city);

        CityModel cityModel = new CityModel(city);
        presenter = new CityPresenter(cityModel);
    }

    @Override
    public void setData(String data) {
        if (presenter.isViewAttached()) {
            dataTextView.setText(data);
        }
    }
}

Это мой ведущий:

public class CityPresenter implements CityContract.Presenter, CityModel.DataCallback {
    private CityModel cityModel;
    private CityContract.View view;
    private Data data;

    public CityPresenter(CityModel cityModel) {
        this.cityModel = cityModel;
        cityModel.getResponse(this);
    }

    @Override
    public boolean isViewAttached() {/* ... */}

    @Override
    public void onResponse(Data data) {
        this.data = data;
        setData(data.getData());
    }

    public Data getData() {
        return data;
    }

    private void setData(String data) {
        view.setData(data);
    }
}

Это моя модель:

public class CityModel implements CityContract.Model {
    private City city;

    public CityModel(City city) {
        this.city = city;
    }

    public void getResponse(DataCallback callback) {
        Callback<Data> dataCallback = new Callback<Data>() {
            @Override
            public void onResponse(@NonNull Call<Data> call, @NonNull Response<Data> response) {
                if (response.isSuccessful()) {
                    Data data = response.body();
                    callback.onResponse(data);
                }
            }
        };
    }

    public interface DataCallback {
        void onResponse(Data data);
    }
}

И это мой тестовый класс, пожалуйста, посмотрите, что я пробовал до сих пор:

@RunWith(MockitoJUnitRunner.class)
public class CityPresenterTest {
    private CityPresenter cityPresenter;
    @Mock
    private CityModel cityModel;
    @Mock
    private Data data;
    @Mock
    private CityModel.DataCallback callback;

    @Before
    public void setUp() {
        cityPresenter = new CityPresenter(cityModel);
    }

    @Test
    public void dataAsyncValidator() {
        doAnswer(invocation -> {
            ((CityModel.DataCallback) invocation.getArguments()[0]).onResponse(data);
            return null;
        }).when(cityModel).getResponse(any(CityModel.DataCallback.class));
    }
}

Я сделал синхронный ответ для обратного вызова.Но как добиться асинхронной части?Заранее спасибо!

...