From c3d1b9bff4d75ded09143292a7a0de5118ad0e78 Mon Sep 17 00:00:00 2001 From: Daniel Rees Date: Thu, 2 Nov 2017 14:37:35 -0400 Subject: [PATCH 1/5] Switched from RxJava to RxJava2 and updated Retrofit 2.3.0 from -beta4 --- app/build.gradle | 3 +- .../QualityMattersRestApiIntegrationTest.java | 12 +++---- .../qualitymatters/api/ApiModule.java | 12 +++---- .../qualitymatters/api/ChangeableBaseUrl.java | 7 ++-- .../api/QualityMattersRestApi.java | 6 ++-- .../qualitymatters/models/ItemsModel.java | 3 +- .../other/DisposableSubscription.java | 29 ++++++++------- .../ui/fragments/ItemsFragment.java | 19 +++++----- .../ui/presenters/ItemsPresenter.java | 6 ++-- .../ItemsPresenterConfiguration.java | 3 +- .../ui/presenters/Presenter.java | 17 +++++---- .../qualitymatters/models/ItemsModelTest.java | 8 ++--- .../other/DisposableSubscriptionTest.java | 35 +++++++++---------- .../other/FinishAsyncJobSubscriptionTest.java | 2 +- .../ItemsPresenterConfigurationTest.java | 7 ++-- .../ui/presenters/ItemsPresenterTest.java | 14 +++----- .../ui/presenters/PresenterTest.java | 25 ++++++------- dependencies.gradle | 10 +++--- 18 files changed, 94 insertions(+), 124 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3922e41..758b7b4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,8 +115,7 @@ dependencies { annotationProcessor libraries.daggerCompiler implementation libraries.rxJava - releaseImplementation libraries.rxJavaProguardRules - implementation libraries.rxLint +// implementation libraries.rxLint implementation libraries.okHttp implementation libraries.retrofit diff --git a/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java b/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java index 939bff9..1b88b9b 100644 --- a/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java +++ b/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java @@ -3,19 +3,17 @@ import com.artemzin.qualitymatters.QualityMattersIntegrationRobolectricTestRunner; import com.artemzin.qualitymatters.api.QualityMattersRestApi; import com.artemzin.qualitymatters.api.entities.Item; - +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import retrofit2.HttpException; import java.io.IOException; import java.util.List; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import retrofit2.adapter.rxjava.HttpException; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -58,7 +56,7 @@ public void items_shouldHandleCorrectResponse() { + "]")); // Get items from the API - List items = qualityMattersRestApi.items().toBlocking().value(); + List items = qualityMattersRestApi.items().blockingGet(); assertThat(items).hasSize(3); @@ -88,7 +86,7 @@ public void items_shouldThrowExceptionIfWebServerRespondError() { mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 " + errorCode + " Not today")); try { - qualityMattersRestApi.items().toBlocking().value(); + qualityMattersRestApi.items().blockingGet(); fail("HttpException should be thrown for error code: " + errorCode); } catch (RuntimeException expected) { HttpException httpException = (HttpException) expected.getCause(); diff --git a/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java b/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java index f47e0fd..16ec97a 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java +++ b/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java @@ -1,19 +1,17 @@ package com.artemzin.qualitymatters.api; import android.support.annotation.NonNull; - import com.artemzin.qualitymatters.BuildConfig; import com.google.gson.Gson; - -import javax.inject.Singleton; - import dagger.Module; import dagger.Provides; import okhttp3.OkHttpClient; import retrofit2.Retrofit; -import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; +import javax.inject.Singleton; + @Module public class ApiModule { @@ -32,10 +30,10 @@ public ChangeableBaseUrl provideChangeableBaseUrl() { @Provides @NonNull @Singleton public QualityMattersRestApi provideQualityMattersApi(@NonNull OkHttpClient okHttpClient, @NonNull Gson gson, @NonNull ChangeableBaseUrl changeableBaseUrl) { return new Retrofit.Builder() - .baseUrl(changeableBaseUrl) + .baseUrl(changeableBaseUrl.url()) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) - .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .validateEagerly(BuildConfig.DEBUG) // Fail early: check Retrofit configuration at creation time in Debug build. .build() .create(QualityMattersRestApi.class); diff --git a/app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java b/app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java index 891e205..3dd20cd 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java +++ b/app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java @@ -1,16 +1,14 @@ package com.artemzin.qualitymatters.api; import android.support.annotation.NonNull; +import okhttp3.HttpUrl; import java.util.concurrent.atomic.AtomicReference; -import okhttp3.HttpUrl; -import retrofit2.BaseUrl; - /** * Such implementation allows us easily change base url in the integration and functional tests! */ -public class ChangeableBaseUrl implements BaseUrl { +public class ChangeableBaseUrl { @NonNull private final AtomicReference baseUrl; @@ -23,7 +21,6 @@ public void setBaseUrl(@NonNull String baseUrl) { this.baseUrl.set(HttpUrl.parse(baseUrl)); } - @Override @NonNull public HttpUrl url() { return baseUrl.get(); } diff --git a/app/src/main/java/com/artemzin/qualitymatters/api/QualityMattersRestApi.java b/app/src/main/java/com/artemzin/qualitymatters/api/QualityMattersRestApi.java index a3fa1f2..451ab64 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/api/QualityMattersRestApi.java +++ b/app/src/main/java/com/artemzin/qualitymatters/api/QualityMattersRestApi.java @@ -1,14 +1,12 @@ package com.artemzin.qualitymatters.api; import android.support.annotation.NonNull; - import com.artemzin.qualitymatters.api.entities.Item; +import io.reactivex.Single; +import retrofit2.http.GET; import java.util.List; -import retrofit2.http.GET; -import rx.Single; - public interface QualityMattersRestApi { @GET("items") @NonNull diff --git a/app/src/main/java/com/artemzin/qualitymatters/models/ItemsModel.java b/app/src/main/java/com/artemzin/qualitymatters/models/ItemsModel.java index 3e00975..382c03d 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/models/ItemsModel.java +++ b/app/src/main/java/com/artemzin/qualitymatters/models/ItemsModel.java @@ -1,13 +1,12 @@ package com.artemzin.qualitymatters.models; import android.support.annotation.NonNull; - import com.artemzin.qualitymatters.api.QualityMattersRestApi; import com.artemzin.qualitymatters.api.entities.Item; +import io.reactivex.Single; import java.util.List; -import rx.Single; /** * Model is not an entity. It's a container for business logic code. M(VC), M(VP), M(VVM). diff --git a/app/src/main/java/com/artemzin/qualitymatters/other/DisposableSubscription.java b/app/src/main/java/com/artemzin/qualitymatters/other/DisposableSubscription.java index af3a2aa..c91e2d7 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/other/DisposableSubscription.java +++ b/app/src/main/java/com/artemzin/qualitymatters/other/DisposableSubscription.java @@ -1,33 +1,36 @@ package com.artemzin.qualitymatters.other; import android.support.annotation.NonNull; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; import java.util.concurrent.atomic.AtomicBoolean; -import rx.Subscription; -import rx.functions.Action0; - -public class DisposableSubscription implements Subscription { +public class DisposableSubscription implements Disposable { @NonNull - private final AtomicBoolean unsubscribed = new AtomicBoolean(false); + private final AtomicBoolean disposed = new AtomicBoolean(false); @NonNull - private final Action0 disposeAction; + private final Action disposeAction; - public DisposableSubscription(@NonNull Action0 disposeAction) { + public DisposableSubscription(@NonNull Action disposeAction) { this.disposeAction = disposeAction; } @Override - public boolean isUnsubscribed() { - return unsubscribed.get(); + public void dispose() { + if (disposed.compareAndSet(false, true)) { + try { + disposeAction.run(); + } catch (Exception e) { + throw new RuntimeException(e); // RxJava2 Action throws an exception. Pass it on + } + } } @Override - public void unsubscribe() { - if (unsubscribed.compareAndSet(false, true)) { - disposeAction.call(); - } + public boolean isDisposed() { + return disposed.get(); } } diff --git a/app/src/main/java/com/artemzin/qualitymatters/ui/fragments/ItemsFragment.java b/app/src/main/java/com/artemzin/qualitymatters/ui/fragments/ItemsFragment.java index eac91ba..4ea5508 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/ui/fragments/ItemsFragment.java +++ b/app/src/main/java/com/artemzin/qualitymatters/ui/fragments/ItemsFragment.java @@ -8,7 +8,10 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; - +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.Unbinder; import com.artemzin.qualitymatters.QualityMattersApp; import com.artemzin.qualitymatters.R; import com.artemzin.qualitymatters.api.entities.Item; @@ -22,19 +25,13 @@ import com.artemzin.qualitymatters.ui.presenters.ItemsPresenter; import com.artemzin.qualitymatters.ui.presenters.ItemsPresenterConfiguration; import com.artemzin.qualitymatters.ui.views.ItemsView; - -import java.util.List; - -import javax.inject.Inject; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; -import butterknife.Unbinder; import dagger.Module; import dagger.Provides; import dagger.Subcomponent; -import rx.schedulers.Schedulers; +import io.reactivex.schedulers.Schedulers; + +import javax.inject.Inject; +import java.util.List; import static android.support.v7.widget.LinearLayoutManager.VERTICAL; import static android.view.View.GONE; diff --git a/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenter.java b/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenter.java index bbebc51..95ca615 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenter.java +++ b/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenter.java @@ -9,7 +9,7 @@ import com.artemzin.qualitymatters.performance.AsyncJobsObserver; import com.artemzin.qualitymatters.ui.views.ItemsView; -import rx.Subscription; +import io.reactivex.disposables.Disposable; public class ItemsPresenter extends Presenter { @@ -47,7 +47,7 @@ public void reloadData() { final AsyncJob asyncJob = asyncJobsObserver.asyncJobStarted("Reload data in ItemsPresenter"); - final Subscription subscription = itemsModel + final Disposable disposable = itemsModel .getItems() .subscribeOn(presenterConfiguration.ioScheduler()) .subscribe( @@ -76,6 +76,6 @@ public void reloadData() { ); // Prevent memory leak. - unsubscribeOnUnbindView(subscription, new FinishAsyncJobSubscription(asyncJobsObserver, asyncJob)); + unsubscribeOnUnbindView(disposable, new FinishAsyncJobSubscription(asyncJobsObserver, asyncJob)); } } diff --git a/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfiguration.java b/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfiguration.java index d9601fe..4c4addd 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfiguration.java +++ b/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfiguration.java @@ -1,10 +1,9 @@ package com.artemzin.qualitymatters.ui.presenters; import android.support.annotation.NonNull; - import com.google.auto.value.AutoValue; +import io.reactivex.Scheduler; -import rx.Scheduler; // Such approach allows us configure presenter in runtime without hardcoded values. // Also, it allows us easily change some parts of the presenter configuration for tests. diff --git a/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/Presenter.java b/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/Presenter.java index 420718b..6479f64 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/Presenter.java +++ b/app/src/main/java/com/artemzin/qualitymatters/ui/presenters/Presenter.java @@ -3,9 +3,8 @@ import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; - -import rx.Subscription; -import rx.subscriptions.CompositeSubscription; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; /** * Base presenter implementation. @@ -15,7 +14,7 @@ public class Presenter { @NonNull - private final CompositeSubscription subscriptionsToUnsubscribeOnUnbindView = new CompositeSubscription(); + private final CompositeDisposable disposablesToDisposeOnUnbindView = new CompositeDisposable(); @Nullable private volatile V view; @@ -36,11 +35,11 @@ protected V view() { return view; } - protected final void unsubscribeOnUnbindView(@NonNull Subscription subscription, @NonNull Subscription... subscriptions) { - subscriptionsToUnsubscribeOnUnbindView.add(subscription); + protected final void unsubscribeOnUnbindView(@NonNull Disposable disposable, @NonNull Disposable... disposables) { + disposablesToDisposeOnUnbindView.add(disposable); - for (Subscription s : subscriptions) { - subscriptionsToUnsubscribeOnUnbindView.add(s); + for (Disposable d : disposables) { + disposablesToDisposeOnUnbindView.add(d); } } @@ -56,6 +55,6 @@ public void unbindView(@NonNull V view) { } // Unsubscribe all subscriptions that need to be unsubscribed in this lifecycle state. - subscriptionsToUnsubscribeOnUnbindView.clear(); + disposablesToDisposeOnUnbindView.clear(); } } diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/models/ItemsModelTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/models/ItemsModelTest.java index aa913ad..c977dbf 100644 --- a/app/src/unitTests/java/com/artemzin/qualitymatters/models/ItemsModelTest.java +++ b/app/src/unitTests/java/com/artemzin/qualitymatters/models/ItemsModelTest.java @@ -2,14 +2,12 @@ import com.artemzin.qualitymatters.api.QualityMattersRestApi; import com.artemzin.qualitymatters.api.entities.Item; - +import io.reactivex.Single; import org.junit.Before; import org.junit.Test; import java.util.List; -import rx.Single; - import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; @@ -31,7 +29,7 @@ public void getItems_shouldReturnItemsFromQualityMattersRestApi() { List items = asList(mock(Item.class), mock(Item.class)); when(qualityMattersRestApi.items()).thenReturn(Single.just(items)); - assertThat(itemsModel.getItems().toBlocking().value()).containsExactlyElementsOf(items); + assertThat(itemsModel.getItems().blockingGet()).containsExactlyElementsOf(items); } @Test @@ -40,7 +38,7 @@ public void getItems_shouldReturnErrorFromQualityMattersRestApi() { when(qualityMattersRestApi.items()).thenReturn(Single.error(error)); try { - itemsModel.getItems().toBlocking().value(); + itemsModel.getItems().blockingGet(); failBecauseExceptionWasNotThrown(RuntimeException.class); } catch (Exception expected) { assertThat(expected).isSameAs(error); diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/other/DisposableSubscriptionTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/other/DisposableSubscriptionTest.java index 6440c4d..3253e38 100644 --- a/app/src/unitTests/java/com/artemzin/qualitymatters/other/DisposableSubscriptionTest.java +++ b/app/src/unitTests/java/com/artemzin/qualitymatters/other/DisposableSubscriptionTest.java @@ -1,48 +1,45 @@ package com.artemzin.qualitymatters.other; +import io.reactivex.functions.Action; import org.junit.Before; import org.junit.Test; -import rx.functions.Action0; - import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.*; public class DisposableSubscriptionTest { - private Action0 disposeAction; + private Action disposeAction; private DisposableSubscription disposableSubscription; @Before public void beforeEachTest() { - disposeAction = mock(Action0.class); + disposeAction = mock(Action.class); disposableSubscription = new DisposableSubscription(disposeAction); } @Test - public void unsubscribed_shouldReturnFalseByDefault() { - assertThat(disposableSubscription.isUnsubscribed()).isFalse(); + public void disposed_shouldReturnFalseByDefault() { + assertThat(disposableSubscription.isDisposed()).isFalse(); verifyZeroInteractions(disposeAction); } @Test - public void unsubscribe_shouldChangeValueOfIsUsubscribed() { - disposableSubscription.unsubscribe(); - assertThat(disposableSubscription.isUnsubscribed()).isTrue(); + public void dispose_shouldChangeValueOfIsDisposed() { + disposableSubscription.dispose(); + assertThat(disposableSubscription.isDisposed()).isTrue(); } @Test - public void unsubscribe_shouldCallDisposableAction() { - disposableSubscription.unsubscribe(); - verify(disposeAction).call(); + public void dispose_shouldCallDisposableAction() throws Exception { + disposableSubscription.dispose(); + verify(disposeAction).run(); } @Test - public void unsubscribeTwice_shouldCallDisposableActionOnce() { - disposableSubscription.unsubscribe(); - disposableSubscription.unsubscribe(); - verify(disposeAction).call(); + public void disposeTwice_shouldCallDisposableActionOnce() throws Exception { + disposableSubscription.dispose(); + disposableSubscription.dispose(); + verify(disposeAction, times(1)).run(); } } \ No newline at end of file diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/other/FinishAsyncJobSubscriptionTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/other/FinishAsyncJobSubscriptionTest.java index 485838f..306e9bc 100644 --- a/app/src/unitTests/java/com/artemzin/qualitymatters/other/FinishAsyncJobSubscriptionTest.java +++ b/app/src/unitTests/java/com/artemzin/qualitymatters/other/FinishAsyncJobSubscriptionTest.java @@ -19,7 +19,7 @@ public void constructor_shouldCreateSuchActionThatWillUnregisterAsyncJob() { DisposableSubscription disposableSubscription = new FinishAsyncJobSubscription(asyncJobsObserver, asyncJob); verifyZeroInteractions(asyncJobsObserver, asyncJob); - disposableSubscription.unsubscribe(); + disposableSubscription.dispose(); verify(asyncJobsObserver).asyncJobFinished(asyncJob); } } \ No newline at end of file diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfigurationTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfigurationTest.java index 412dd7b..0b44233 100644 --- a/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfigurationTest.java +++ b/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterConfigurationTest.java @@ -1,10 +1,9 @@ package com.artemzin.qualitymatters.ui.presenters; -import org.junit.Test; - +import io.reactivex.schedulers.Schedulers; import nl.jqno.equalsverifier.EqualsVerifier; import nl.jqno.equalsverifier.Warning; -import rx.schedulers.Schedulers; +import org.junit.Test; public class ItemsPresenterConfigurationTest { @@ -12,7 +11,7 @@ public class ItemsPresenterConfigurationTest { public void hashCode_equals_shouldWorkCorrectly() { EqualsVerifier .forExamples( - ItemsPresenterConfiguration.builder().ioScheduler(Schedulers.immediate()).build(), + ItemsPresenterConfiguration.builder().ioScheduler(Schedulers.trampoline()).build(), ItemsPresenterConfiguration.builder().ioScheduler(Schedulers.io()).build()) .suppress(Warning.NULL_FIELDS) // AutoValue checks for nulls, but EqualsVerifier does not expect that by default. .verify(); diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterTest.java index 9d8bc8a..f19a33d 100644 --- a/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterTest.java +++ b/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/ItemsPresenterTest.java @@ -6,24 +6,18 @@ import com.artemzin.qualitymatters.performance.AsyncJob; import com.artemzin.qualitymatters.performance.AsyncJobsObserver; import com.artemzin.qualitymatters.ui.views.ItemsView; - +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; import org.junit.Before; import org.junit.Test; import java.util.List; -import rx.Single; -import rx.schedulers.Schedulers; - import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyListOf; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; public class ItemsPresenterTest { private ItemsModel itemsModel; @@ -37,7 +31,7 @@ public class ItemsPresenterTest { public void beforeEachTest() { itemsModel = mock(ItemsModel.class); presenterConfiguration = ItemsPresenterConfiguration.builder() - .ioScheduler(Schedulers.immediate()) // We don't need async behavior in tests. + .ioScheduler(Schedulers.trampoline()) // We don't need async behavior in tests. .build(); asyncJobsObserver = mock(AsyncJobsObserver.class); diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/PresenterTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/PresenterTest.java index 2c4bea9..c1641e5 100644 --- a/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/PresenterTest.java +++ b/app/src/unitTests/java/com/artemzin/qualitymatters/ui/presenters/PresenterTest.java @@ -1,15 +1,12 @@ package com.artemzin.qualitymatters.ui.presenters; +import io.reactivex.disposables.Disposable; import org.junit.Before; import org.junit.Test; -import rx.Subscription; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; public class PresenterTest { private Presenter presenter; @@ -48,19 +45,19 @@ public void view_shouldReturnNullByDefault() { public void unsubscribeOnUnbindView_shouldWorkAccordingItsContract() { presenter.bindView(view); - Subscription subscription1 = mock(Subscription.class); - Subscription subscription2 = mock(Subscription.class); - Subscription subscription3 = mock(Subscription.class); + Disposable subscription1 = mock(Disposable.class); + Disposable subscription2 = mock(Disposable.class); + Disposable subscription3 = mock(Disposable.class); presenter.unsubscribeOnUnbindView(subscription1, subscription2, subscription3); - verify(subscription1, never()).unsubscribe(); - verify(subscription2, never()).unsubscribe(); - verify(subscription3, never()).unsubscribe(); + verify(subscription1, never()).dispose(); + verify(subscription2, never()).dispose(); + verify(subscription3, never()).dispose(); presenter.unbindView(view); - verify(subscription1).unsubscribe(); - verify(subscription2).unsubscribe(); - verify(subscription3).unsubscribe(); + verify(subscription1).dispose(); + verify(subscription2).dispose(); + verify(subscription3).dispose(); } @Test diff --git a/dependencies.gradle b/dependencies.gradle index 46d57f2..96dd63b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -19,12 +19,11 @@ ext.versions = [ dagger : '2.6', - rxJava : '1.1.8', - rxJavaProguardRules : '1.1.8.0', + rxJava : '2.1.6', rxLint : '1.6', supportLibs : '23.1.1', okHttp : '3.2.0', - retrofit : '2.0.0-beta4', + retrofit : '2.3.0', gson : '2.7', autoValue : '1.2', autoValueGson : '0.4.2', @@ -64,15 +63,14 @@ ext.libraries = [ dagger : "com.google.dagger:dagger:$versions.dagger", daggerCompiler : "com.google.dagger:dagger-compiler:$versions.dagger", - rxJava : "io.reactivex:rxjava:$versions.rxJava", - rxJavaProguardRules : "com.artemzin.rxjava:proguard-rules:$versions.rxJavaProguardRules", + rxJava : "io.reactivex.rxjava2:rxjava:$versions.rxJava", rxLint : "nl.littlerobots.rxlint:rxlint:$versions.rxLint", okHttp : "com.squareup.okhttp3:okhttp:$versions.okHttp", okHttpLoggingInterceptor: "com.squareup.okhttp3:logging-interceptor:$versions.okHttp", retrofit : "com.squareup.retrofit2:retrofit:$versions.retrofit", retrofitGsonConverter : "com.squareup.retrofit2:converter-gson:$versions.retrofit", - retrofitRxJavaAdapter : "com.squareup.retrofit2:adapter-rxjava:$versions.retrofit", + retrofitRxJavaAdapter : "com.squareup.retrofit2:adapter-rxjava2:$versions.retrofit", gson : "com.google.code.gson:gson:$versions.gson", autoValue : "com.google.auto.value:auto-value:$versions.autoValue", From 6499f5e51b7f2f00e68f5592bd3c5eb366f09c4c Mon Sep 17 00:00:00 2001 From: Daniel Rees Date: Thu, 2 Nov 2017 14:49:10 -0400 Subject: [PATCH 2/5] Fixed http test --- app/build.gradle | 2 +- .../api/QualityMattersRestApiIntegrationTest.java | 3 +-- dependencies.gradle | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 758b7b4..f31ec33 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,7 +115,7 @@ dependencies { annotationProcessor libraries.daggerCompiler implementation libraries.rxJava -// implementation libraries.rxLint + implementation libraries.rxLint implementation libraries.okHttp implementation libraries.retrofit diff --git a/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java b/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java index 1b88b9b..b414637 100644 --- a/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java +++ b/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java @@ -88,8 +88,7 @@ public void items_shouldThrowExceptionIfWebServerRespondError() { try { qualityMattersRestApi.items().blockingGet(); fail("HttpException should be thrown for error code: " + errorCode); - } catch (RuntimeException expected) { - HttpException httpException = (HttpException) expected.getCause(); + } catch (HttpException httpException ) { assertThat(httpException.code()).isEqualTo(errorCode); assertThat(httpException.message()).isEqualTo("Not today"); } diff --git a/dependencies.gradle b/dependencies.gradle index 96dd63b..7436df7 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -22,7 +22,7 @@ ext.versions = [ rxJava : '2.1.6', rxLint : '1.6', supportLibs : '23.1.1', - okHttp : '3.2.0', + okHttp : '3.8.0', retrofit : '2.3.0', gson : '2.7', autoValue : '1.2', From 0aa947003e093332e6abfc05b384b814425c05f2 Mon Sep 17 00:00:00 2001 From: Daniel Rees Date: Fri, 3 Nov 2017 10:48:11 -0400 Subject: [PATCH 3/5] Updates after review --- .idea/codeStyleSettings.xml | 2 +- .../other/DisposableSubscription.java | 3 ++- .../other/FinishAsyncJobAction.java | 27 +++++++++++++++++++ .../other/FinishAsyncJobSubscription.java | 20 -------------- .../ui/presenters/ItemsPresenter.java | 7 +++-- ...est.java => FinishAsyncJobActionTest.java} | 8 +++--- dependencies.gradle | 2 +- 7 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/com/artemzin/qualitymatters/other/FinishAsyncJobAction.java delete mode 100644 app/src/main/java/com/artemzin/qualitymatters/other/FinishAsyncJobSubscription.java rename app/src/unitTests/java/com/artemzin/qualitymatters/other/{FinishAsyncJobSubscriptionTest.java => FinishAsyncJobActionTest.java} (71%) diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml index 8fccfbb..7b6f2a0 100644 --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -205,4 +205,4 @@