mirror of
https://github.com/android10/Android-CleanArchitecture.git
synced 2026-03-13 10:13:41 +08:00
Migrate to RxJava 2.
This commit is contained in:
@@ -15,8 +15,8 @@ ext {
|
||||
daggerVersion = '2.8'
|
||||
butterKnifeVersion = '7.0.1'
|
||||
recyclerViewVersion = '21.0.3'
|
||||
rxJavaVersion = '1.0.14'
|
||||
rxAndroidVersion = '1.0.1'
|
||||
rxJavaVersion = '2.0.2'
|
||||
rxAndroidVersion = '2.0.1'
|
||||
javaxAnnotationVersion = '1.0'
|
||||
javaxInjectVersion = '1'
|
||||
gsonVersion = '2.3'
|
||||
@@ -41,8 +41,8 @@ ext {
|
||||
dagger: "com.google.dagger:dagger:${daggerVersion}",
|
||||
butterKnife: "com.jakewharton:butterknife:${butterKnifeVersion}",
|
||||
recyclerView: "com.android.support:recyclerview-v7:${recyclerViewVersion}",
|
||||
rxJava: "io.reactivex:rxjava:${rxJavaVersion}",
|
||||
rxAndroid: "io.reactivex:rxandroid:${rxAndroidVersion}",
|
||||
rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
|
||||
rxAndroid: "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
|
||||
javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}"
|
||||
]
|
||||
|
||||
@@ -57,7 +57,7 @@ ext {
|
||||
domainDependencies = [
|
||||
javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
|
||||
javaxInject: "javax.inject:javax.inject:${javaxInjectVersion}",
|
||||
rxJava: "io.reactivex:rxjava:${rxJavaVersion}",
|
||||
rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
|
||||
arrow: "com.fernandocejas:arrow:${arrowVersion}"
|
||||
]
|
||||
|
||||
@@ -72,8 +72,8 @@ ext {
|
||||
dagger: "com.google.dagger:dagger:${daggerVersion}",
|
||||
okHttp: "com.squareup.okhttp:okhttp:${okHttpVersion}",
|
||||
gson: "com.google.code.gson:gson:${gsonVersion}",
|
||||
rxJava: "io.reactivex:rxjava:${rxJavaVersion}",
|
||||
rxAndroid: "io.reactivex:rxandroid:${rxAndroidVersion}",
|
||||
rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
|
||||
rxAndroid: "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
|
||||
javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
|
||||
javaxInject: "javax.inject:javax.inject:${javaxInjectVersion}",
|
||||
androidAnnotations: "com.android.support:support-annotations:${androidAnnotationsVersion}"
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
package com.fernandocejas.android10.sample.data.cache;
|
||||
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import rx.Observable;
|
||||
import io.reactivex.Observable;
|
||||
|
||||
/**
|
||||
* An interface representing a user Cache.
|
||||
*/
|
||||
public interface UserCache {
|
||||
/**
|
||||
* Gets an {@link rx.Observable} which will emit a {@link UserEntity}.
|
||||
* Gets an {@link Observable} which will emit a {@link UserEntity}.
|
||||
*
|
||||
* @param userId The user id to retrieve data.
|
||||
*/
|
||||
|
||||
@@ -20,10 +20,10 @@ import com.fernandocejas.android10.sample.data.cache.serializer.Serializer;
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import com.fernandocejas.android10.sample.data.exception.UserNotFoundException;
|
||||
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
|
||||
import io.reactivex.Observable;
|
||||
import java.io.File;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* {@link UserCache} implementation.
|
||||
@@ -63,17 +63,17 @@ public class UserCacheImpl implements UserCache {
|
||||
}
|
||||
|
||||
@Override public Observable<UserEntity> get(final int userId) {
|
||||
return Observable.create(subscriber -> {
|
||||
return Observable.create(emitter -> {
|
||||
final File userEntityFile = UserCacheImpl.this.buildFile(userId);
|
||||
final String fileContent = UserCacheImpl.this.fileManager.readFileContent(userEntityFile);
|
||||
final UserEntity userEntity =
|
||||
UserCacheImpl.this.serializer.deserialize(fileContent, UserEntity.class);
|
||||
|
||||
if (userEntity != null) {
|
||||
subscriber.onNext(userEntity);
|
||||
subscriber.onCompleted();
|
||||
emitter.onNext(userEntity);
|
||||
emitter.onComplete();
|
||||
} else {
|
||||
subscriber.onError(new UserNotFoundException());
|
||||
emitter.onError(new UserNotFoundException());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
package com.fernandocejas.android10.sample.data.net;
|
||||
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import io.reactivex.Observable;
|
||||
import java.util.List;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* RestApi for retrieving data from the network.
|
||||
@@ -32,12 +32,12 @@ public interface RestApi {
|
||||
String API_URL_GET_USER_DETAILS = API_BASE_URL + "user_";
|
||||
|
||||
/**
|
||||
* Retrieves an {@link rx.Observable} which will emit a List of {@link UserEntity}.
|
||||
* Retrieves an {@link Observable} which will emit a List of {@link UserEntity}.
|
||||
*/
|
||||
Observable<List<UserEntity>> userEntityList();
|
||||
|
||||
/**
|
||||
* Retrieves an {@link rx.Observable} which will emit a {@link UserEntity}.
|
||||
* Retrieves an {@link Observable} which will emit a {@link UserEntity}.
|
||||
*
|
||||
* @param userId The user id used to get user data.
|
||||
*/
|
||||
|
||||
@@ -21,9 +21,9 @@ import android.net.NetworkInfo;
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import com.fernandocejas.android10.sample.data.entity.mapper.UserEntityJsonMapper;
|
||||
import com.fernandocejas.android10.sample.data.exception.NetworkConnectionException;
|
||||
import io.reactivex.Observable;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.List;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* {@link RestApi} implementation for retrieving data from the network.
|
||||
@@ -48,42 +48,42 @@ public class RestApiImpl implements RestApi {
|
||||
}
|
||||
|
||||
@Override public Observable<List<UserEntity>> userEntityList() {
|
||||
return Observable.create(subscriber -> {
|
||||
return Observable.create(emitter -> {
|
||||
if (isThereInternetConnection()) {
|
||||
try {
|
||||
String responseUserEntities = getUserEntitiesFromApi();
|
||||
if (responseUserEntities != null) {
|
||||
subscriber.onNext(userEntityJsonMapper.transformUserEntityCollection(
|
||||
emitter.onNext(userEntityJsonMapper.transformUserEntityCollection(
|
||||
responseUserEntities));
|
||||
subscriber.onCompleted();
|
||||
emitter.onComplete();
|
||||
} else {
|
||||
subscriber.onError(new NetworkConnectionException());
|
||||
emitter.onError(new NetworkConnectionException());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
subscriber.onError(new NetworkConnectionException(e.getCause()));
|
||||
emitter.onError(new NetworkConnectionException(e.getCause()));
|
||||
}
|
||||
} else {
|
||||
subscriber.onError(new NetworkConnectionException());
|
||||
emitter.onError(new NetworkConnectionException());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override public Observable<UserEntity> userEntityById(final int userId) {
|
||||
return Observable.create(subscriber -> {
|
||||
return Observable.create(emitter -> {
|
||||
if (isThereInternetConnection()) {
|
||||
try {
|
||||
String responseUserDetails = getUserDetailsFromApi(userId);
|
||||
if (responseUserDetails != null) {
|
||||
subscriber.onNext(userEntityJsonMapper.transformUserEntity(responseUserDetails));
|
||||
subscriber.onCompleted();
|
||||
emitter.onNext(userEntityJsonMapper.transformUserEntity(responseUserDetails));
|
||||
emitter.onComplete();
|
||||
} else {
|
||||
subscriber.onError(new NetworkConnectionException());
|
||||
emitter.onError(new NetworkConnectionException());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
subscriber.onError(new NetworkConnectionException(e.getCause()));
|
||||
emitter.onError(new NetworkConnectionException(e.getCause()));
|
||||
}
|
||||
} else {
|
||||
subscriber.onError(new NetworkConnectionException());
|
||||
emitter.onError(new NetworkConnectionException());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@ import com.fernandocejas.android10.sample.data.repository.datasource.UserDataSto
|
||||
import com.fernandocejas.android10.sample.data.repository.datasource.UserDataStoreFactory;
|
||||
import com.fernandocejas.android10.sample.domain.User;
|
||||
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
|
||||
import io.reactivex.Observable;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* {@link UserRepository} for retrieving user data.
|
||||
|
||||
@@ -18,9 +18,8 @@ package com.fernandocejas.android10.sample.data.repository.datasource;
|
||||
import com.fernandocejas.android10.sample.data.cache.UserCache;
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import com.fernandocejas.android10.sample.data.net.RestApi;
|
||||
import io.reactivex.Observable;
|
||||
import java.util.List;
|
||||
import rx.Observable;
|
||||
import rx.functions.Action1;
|
||||
|
||||
/**
|
||||
* {@link UserDataStore} implementation based on connections to the api (Cloud).
|
||||
@@ -30,12 +29,6 @@ class CloudUserDataStore implements UserDataStore {
|
||||
private final RestApi restApi;
|
||||
private final UserCache userCache;
|
||||
|
||||
private final Action1<UserEntity> saveToCacheAction = userEntity -> {
|
||||
if (userEntity != null) {
|
||||
CloudUserDataStore.this.userCache.put(userEntity);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Construct a {@link UserDataStore} based on connections to the api (Cloud).
|
||||
*
|
||||
@@ -52,6 +45,6 @@ class CloudUserDataStore implements UserDataStore {
|
||||
}
|
||||
|
||||
@Override public Observable<UserEntity> userEntityDetails(final int userId) {
|
||||
return this.restApi.userEntityById(userId).doOnNext(saveToCacheAction);
|
||||
return this.restApi.userEntityById(userId).doOnNext(CloudUserDataStore.this.userCache::put);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,8 @@ package com.fernandocejas.android10.sample.data.repository.datasource;
|
||||
|
||||
import com.fernandocejas.android10.sample.data.cache.UserCache;
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import io.reactivex.Observable;
|
||||
import java.util.List;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* {@link UserDataStore} implementation based on file system data store.
|
||||
|
||||
@@ -16,20 +16,20 @@
|
||||
package com.fernandocejas.android10.sample.data.repository.datasource;
|
||||
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import io.reactivex.Observable;
|
||||
import java.util.List;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* Interface that represents a data store from where data is retrieved.
|
||||
*/
|
||||
public interface UserDataStore {
|
||||
/**
|
||||
* Get an {@link rx.Observable} which will emit a List of {@link UserEntity}.
|
||||
* Get an {@link Observable} which will emit a List of {@link UserEntity}.
|
||||
*/
|
||||
Observable<List<UserEntity>> userEntityList();
|
||||
|
||||
/**
|
||||
* Get an {@link rx.Observable} which will emit a {@link UserEntity} by its id.
|
||||
* Get an {@link Observable} which will emit a {@link UserEntity} by its id.
|
||||
*
|
||||
* @param userId The id to retrieve user data.
|
||||
*/
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.fernandocejas.android10.sample.data.entity.mapper.UserEntityDataMappe
|
||||
import com.fernandocejas.android10.sample.data.repository.datasource.UserDataStore;
|
||||
import com.fernandocejas.android10.sample.data.repository.datasource.UserDataStoreFactory;
|
||||
import com.fernandocejas.android10.sample.domain.User;
|
||||
import io.reactivex.Observable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.junit.Before;
|
||||
@@ -29,7 +30,6 @@ import org.junit.rules.ExpectedException;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import rx.Observable;
|
||||
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
|
||||
@@ -18,12 +18,12 @@ package com.fernandocejas.android10.sample.data.repository.datasource;
|
||||
import com.fernandocejas.android10.sample.data.cache.UserCache;
|
||||
import com.fernandocejas.android10.sample.data.entity.UserEntity;
|
||||
import com.fernandocejas.android10.sample.data.net.RestApi;
|
||||
import io.reactivex.Observable;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import rx.Observable;
|
||||
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
package com.fernandocejas.android10.sample.domain.executor;
|
||||
|
||||
import rx.Scheduler;
|
||||
import io.reactivex.Scheduler;
|
||||
|
||||
/**
|
||||
* Thread abstraction created to change the execution context from any thread to any other thread.
|
||||
|
||||
@@ -15,19 +15,21 @@
|
||||
*/
|
||||
package com.fernandocejas.android10.sample.domain.interactor;
|
||||
|
||||
import io.reactivex.observers.DisposableObserver;
|
||||
|
||||
/**
|
||||
* Default subscriber base class to be used whenever you want default error handling.
|
||||
* Default {@link DisposableObserver} base class to be used whenever you want default error handling.
|
||||
*/
|
||||
public class DefaultSubscriber<T> extends rx.Subscriber<T> {
|
||||
@Override public void onCompleted() {
|
||||
// no-op by default.
|
||||
}
|
||||
|
||||
@Override public void onError(Throwable e) {
|
||||
// no-op by default.
|
||||
}
|
||||
|
||||
public class DefaultObserver<T> extends DisposableObserver<T> {
|
||||
@Override public void onNext(T t) {
|
||||
// no-op by default.
|
||||
}
|
||||
|
||||
@Override public void onComplete() {
|
||||
// no-op by default.
|
||||
}
|
||||
|
||||
@Override public void onError(Throwable exception) {
|
||||
// no-op by default.
|
||||
}
|
||||
}
|
||||
@@ -21,8 +21,8 @@ import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
|
||||
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
|
||||
import com.fernandocejas.arrow.annotations.VisibleForTesting;
|
||||
import com.fernandocejas.arrow.optional.Optional;
|
||||
import io.reactivex.Observable;
|
||||
import javax.inject.Inject;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* This class is an implementation of {@link UseCase} that represents a use case for
|
||||
|
||||
@@ -20,8 +20,8 @@ import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
|
||||
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
|
||||
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
|
||||
import com.fernandocejas.arrow.optional.Optional;
|
||||
import io.reactivex.Observable;
|
||||
import javax.inject.Inject;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* This class is an implementation of {@link UseCase} that represents a use case for
|
||||
|
||||
@@ -17,59 +17,69 @@ package com.fernandocejas.android10.sample.domain.interactor;
|
||||
|
||||
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
|
||||
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
|
||||
import com.fernandocejas.arrow.checks.Preconditions;
|
||||
import com.fernandocejas.arrow.optional.Optional;
|
||||
import rx.Observable;
|
||||
import rx.Subscriber;
|
||||
import rx.Subscription;
|
||||
import rx.schedulers.Schedulers;
|
||||
import rx.subscriptions.Subscriptions;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.observers.DisposableObserver;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
/**
|
||||
* Abstract class for a Use Case (Interactor in terms of Clean Architecture).
|
||||
* This interface represents a execution unit for different use cases (this means any use case
|
||||
* in the application should implement this contract).
|
||||
*
|
||||
* By convention each UseCase implementation will return the result using a {@link rx.Subscriber}
|
||||
* By convention each UseCase implementation will return the result using a {@link DisposableObserver}
|
||||
* that will execute its job in a background thread and will post the result in the UI thread.
|
||||
*/
|
||||
public abstract class UseCase {
|
||||
|
||||
private final ThreadExecutor threadExecutor;
|
||||
private final PostExecutionThread postExecutionThread;
|
||||
private final CompositeDisposable disposables;
|
||||
|
||||
private Subscription subscription = Subscriptions.empty();
|
||||
|
||||
protected UseCase(ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) {
|
||||
UseCase(ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) {
|
||||
this.threadExecutor = threadExecutor;
|
||||
this.postExecutionThread = postExecutionThread;
|
||||
this.disposables = new CompositeDisposable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds an {@link rx.Observable} which will be used when executing the current {@link UseCase}.
|
||||
* Builds an {@link Observable} which will be used when executing the current {@link UseCase}.
|
||||
*/
|
||||
protected abstract Observable buildUseCaseObservable(Optional<Params> params);
|
||||
|
||||
/**
|
||||
* Executes the current use case.
|
||||
*
|
||||
* @param useCaseSubscriber Subscriber which will be listening to the observable build
|
||||
* @param observer {@link DisposableObserver} which will be listening to the observable build
|
||||
* by {@link #buildUseCaseObservable(Optional)} ()} method.
|
||||
* @param params Parameters used to build execute this use case.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public void execute(Subscriber useCaseSubscriber, Params params) {
|
||||
this.subscription = this.buildUseCaseObservable(Optional.of(params))
|
||||
public void execute(DisposableObserver observer, Params params) {
|
||||
final Observable<?> observable = this.buildUseCaseObservable(Optional.of(params))
|
||||
.subscribeOn(Schedulers.from(threadExecutor))
|
||||
.observeOn(postExecutionThread.getScheduler())
|
||||
.subscribe(useCaseSubscriber);
|
||||
.observeOn(postExecutionThread.getScheduler());
|
||||
addDisposable(observable.subscribeWith(observer));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribes from current {@link rx.Subscription}.
|
||||
* Dispose from current {@link CompositeDisposable}.
|
||||
*/
|
||||
public void unsubscribe() {
|
||||
if (!subscription.isUnsubscribed()) {
|
||||
subscription.unsubscribe();
|
||||
public void dispose() {
|
||||
if (!disposables.isDisposed()) {
|
||||
disposables.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispose from current {@link CompositeDisposable}.
|
||||
*/
|
||||
private void addDisposable(Disposable disposable) {
|
||||
Preconditions.checkNotNull(disposable);
|
||||
Preconditions.checkNotNull(disposables);
|
||||
disposables.add(disposable);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,20 +16,20 @@
|
||||
package com.fernandocejas.android10.sample.domain.repository;
|
||||
|
||||
import com.fernandocejas.android10.sample.domain.User;
|
||||
import io.reactivex.Observable;
|
||||
import java.util.List;
|
||||
import rx.Observable;
|
||||
|
||||
/**
|
||||
* Interface that represents a Repository for getting {@link User} related data.
|
||||
*/
|
||||
public interface UserRepository {
|
||||
/**
|
||||
* Get an {@link rx.Observable} which will emit a List of {@link User}.
|
||||
* Get an {@link Observable} which will emit a List of {@link User}.
|
||||
*/
|
||||
Observable<List<User>> users();
|
||||
|
||||
/**
|
||||
* Get an {@link rx.Observable} which will emit a {@link User}.
|
||||
* Get an {@link Observable} which will emit a {@link User}.
|
||||
*
|
||||
* @param userId The user id used to retrieve user data.
|
||||
*/
|
||||
|
||||
@@ -19,12 +19,12 @@ import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
|
||||
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
|
||||
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
|
||||
import com.fernandocejas.arrow.optional.Optional;
|
||||
import io.reactivex.Observable;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import rx.Observable;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@@ -18,15 +18,14 @@ package com.fernandocejas.android10.sample.domain.interactor;
|
||||
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
|
||||
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
|
||||
import com.fernandocejas.arrow.optional.Optional;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.observers.DisposableObserver;
|
||||
import io.reactivex.schedulers.TestScheduler;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import rx.Observable;
|
||||
import rx.Subscriber;
|
||||
import rx.observers.TestSubscriber;
|
||||
import rx.schedulers.TestScheduler;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
@@ -36,34 +35,32 @@ public class UseCaseTest {
|
||||
|
||||
private UseCaseTestClass useCase;
|
||||
|
||||
private TestDisposableObserver testObserver;
|
||||
|
||||
@Mock private ThreadExecutor mockThreadExecutor;
|
||||
@Mock private PostExecutionThread mockPostExecutionThread;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
this.useCase = new UseCaseTestClass(mockThreadExecutor, mockPostExecutionThread);
|
||||
this.testObserver = new TestDisposableObserver<>();
|
||||
given(mockPostExecutionThread.getScheduler()).willReturn(new TestScheduler());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testBuildUseCaseObservableReturnCorrectResult() {
|
||||
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();
|
||||
TestScheduler testScheduler = new TestScheduler();
|
||||
given(mockPostExecutionThread.getScheduler()).willReturn(testScheduler);
|
||||
useCase.execute(testObserver, Params.EMPTY);
|
||||
|
||||
useCase.execute(testSubscriber, Params.EMPTY);
|
||||
|
||||
assertThat(testSubscriber.getOnNextEvents().size()).isZero();
|
||||
assertThat(testObserver.valuesCount).isZero();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSubscriptionWhenExecutingUseCase() {
|
||||
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();
|
||||
useCase.execute(testObserver, Params.EMPTY);
|
||||
useCase.dispose();
|
||||
|
||||
useCase.execute(testSubscriber, Params.EMPTY);
|
||||
useCase.unsubscribe();
|
||||
|
||||
assertThat(testSubscriber.isUnsubscribed()).isTrue();
|
||||
assertThat(testObserver.isDisposed()).isTrue();
|
||||
}
|
||||
|
||||
private static class UseCaseTestClass extends UseCase {
|
||||
@@ -76,8 +73,24 @@ public class UseCaseTest {
|
||||
return Observable.empty();
|
||||
}
|
||||
|
||||
@Override public void execute(Subscriber useCaseSubscriber, Params params) {
|
||||
super.execute(useCaseSubscriber, Params.EMPTY);
|
||||
@Override public void execute(DisposableObserver observer, Params params) {
|
||||
super.execute(observer, Params.EMPTY);
|
||||
}
|
||||
}
|
||||
|
||||
private static class TestDisposableObserver<T> extends DisposableObserver<T> {
|
||||
private int valuesCount = 0;
|
||||
|
||||
@Override public void onNext(T value) {
|
||||
valuesCount++;
|
||||
}
|
||||
|
||||
@Override public void onError(Throwable e) {
|
||||
// no-op by default.
|
||||
}
|
||||
|
||||
@Override public void onComplete() {
|
||||
// no-op by default.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,12 +20,12 @@ import com.fernandocejas.android10.sample.domain.interactor.GetUserDetails;
|
||||
import com.fernandocejas.android10.sample.presentation.mapper.UserModelDataMapper;
|
||||
import com.fernandocejas.android10.sample.presentation.presenter.UserDetailsPresenter;
|
||||
import com.fernandocejas.android10.sample.presentation.view.UserDetailsView;
|
||||
import io.reactivex.observers.DisposableObserver;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import rx.Subscriber;
|
||||
|
||||
import com.fernandocejas.android10.sample.domain.interactor.Params;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
@@ -58,6 +58,6 @@ public class UserDetailsPresenterTest {
|
||||
|
||||
verify(mockUserDetailsView).hideRetry();
|
||||
verify(mockUserDetailsView).showLoading();
|
||||
verify(mockGetUserDetails).execute(any(Subscriber.class), any(Params.class));
|
||||
verify(mockGetUserDetails).execute(any(DisposableObserver.class), any(Params.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,12 +21,12 @@ import com.fernandocejas.android10.sample.domain.interactor.Params;
|
||||
import com.fernandocejas.android10.sample.presentation.mapper.UserModelDataMapper;
|
||||
import com.fernandocejas.android10.sample.presentation.presenter.UserListPresenter;
|
||||
import com.fernandocejas.android10.sample.presentation.view.UserListView;
|
||||
import io.reactivex.observers.DisposableObserver;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import rx.Subscriber;
|
||||
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Matchers.any;
|
||||
@@ -56,6 +56,6 @@ public class UserListPresenterTest {
|
||||
|
||||
verify(mockUserListView).hideRetry();
|
||||
verify(mockUserListView).showLoading();
|
||||
verify(mockGetUserList).execute(any(Subscriber.class), any(Params.class));
|
||||
verify(mockGetUserList).execute(any(DisposableObserver.class), any(Params.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
package com.fernandocejas.android10.sample.presentation;
|
||||
|
||||
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
|
||||
import io.reactivex.Scheduler;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import rx.Scheduler;
|
||||
import rx.android.schedulers.AndroidSchedulers;
|
||||
|
||||
/**
|
||||
* MainThread (UI Thread) implementation based on a {@link rx.Scheduler}
|
||||
* MainThread (UI Thread) implementation based on a {@link Scheduler}
|
||||
* which will execute actions on the Android UI thread
|
||||
*/
|
||||
@Singleton
|
||||
|
||||
@@ -19,7 +19,7 @@ import android.support.annotation.NonNull;
|
||||
import com.fernandocejas.android10.sample.domain.User;
|
||||
import com.fernandocejas.android10.sample.domain.exception.DefaultErrorBundle;
|
||||
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.DefaultSubscriber;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.DefaultObserver;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.GetUserDetails;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.UseCase;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.Params;
|
||||
@@ -59,7 +59,7 @@ public class UserDetailsPresenter implements Presenter {
|
||||
@Override public void pause() {}
|
||||
|
||||
@Override public void destroy() {
|
||||
this.getUserDetailsUseCase.unsubscribe();
|
||||
this.getUserDetailsUseCase.dispose();
|
||||
this.viewDetailsView = null;
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ public class UserDetailsPresenter implements Presenter {
|
||||
private void getUserDetails(int userId) {
|
||||
final Params params = Params.create();
|
||||
params.putInt(GetUserDetails.PARAM_USER_ID_KEY, userId);
|
||||
this.getUserDetailsUseCase.execute(new UserDetailsSubscriber(), params);
|
||||
this.getUserDetailsUseCase.execute(new UserDetailsObserver(), params);
|
||||
}
|
||||
|
||||
private void showViewLoading() {
|
||||
@@ -106,9 +106,9 @@ public class UserDetailsPresenter implements Presenter {
|
||||
this.viewDetailsView.renderUser(userModel);
|
||||
}
|
||||
|
||||
private final class UserDetailsSubscriber extends DefaultSubscriber<User> {
|
||||
private final class UserDetailsObserver extends DefaultObserver<User> {
|
||||
|
||||
@Override public void onCompleted() {
|
||||
@Override public void onComplete() {
|
||||
UserDetailsPresenter.this.hideViewLoading();
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ import android.support.annotation.NonNull;
|
||||
import com.fernandocejas.android10.sample.domain.User;
|
||||
import com.fernandocejas.android10.sample.domain.exception.DefaultErrorBundle;
|
||||
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.DefaultSubscriber;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.DefaultObserver;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.GetUserList;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.UseCase;
|
||||
import com.fernandocejas.android10.sample.domain.interactor.Params;
|
||||
@@ -61,7 +61,7 @@ public class UserListPresenter implements Presenter {
|
||||
@Override public void pause() {}
|
||||
|
||||
@Override public void destroy() {
|
||||
this.getUserListUseCase.unsubscribe();
|
||||
this.getUserListUseCase.dispose();
|
||||
this.viewListView = null;
|
||||
}
|
||||
|
||||
@@ -114,12 +114,12 @@ public class UserListPresenter implements Presenter {
|
||||
}
|
||||
|
||||
private void getUserList() {
|
||||
this.getUserListUseCase.execute(new UserListSubscriber(), Params.EMPTY);
|
||||
this.getUserListUseCase.execute(new UserListObserver(), Params.EMPTY);
|
||||
}
|
||||
|
||||
private final class UserListSubscriber extends DefaultSubscriber<List<User>> {
|
||||
private final class UserListObserver extends DefaultObserver<List<User>> {
|
||||
|
||||
@Override public void onCompleted() {
|
||||
@Override public void onComplete() {
|
||||
UserListPresenter.this.hideViewLoading();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user