Drop support for RxJava 1.

Closes #2469
This commit is contained in:
Mark Paluch
2021-09-27 11:30:30 +02:00
committed by Jens Schauder
parent 5a59e43745
commit 20a1220cd1
12 changed files with 30 additions and 220 deletions

14
pom.xml
View File

@@ -112,20 +112,6 @@
<!-- RxJava -->
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
<version>${rxjava}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava-reactive-streams</artifactId>
<version>${rxjava-reactive-streams}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>

View File

@@ -22,8 +22,6 @@ import kotlinx.coroutines.flow.FlowKt;
import kotlinx.coroutines.reactive.ReactiveFlowKt;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import rx.Observable;
import rx.Single;
import java.util.ArrayList;
import java.util.List;
@@ -54,8 +52,6 @@ import org.springframework.util.ClassUtils;
* <p>
* This class discovers reactive wrapper availability and their conversion support based on the class path. Reactive
* wrapper types might be supported/on the class path but conversion may require additional dependencies.
* <p>
* <strong>Note:</strong> As of Spring Data 2.4, support for RxJava 1.x is deprecated in favor of RxJava 2 and 3.
*
* @author Mark Paluch
* @author Oliver Gierke
@@ -72,12 +68,6 @@ public abstract class ReactiveWrapperConverters {
static {
if (ReactiveWrappers.isAvailable(ReactiveLibrary.RXJAVA1)) {
REACTIVE_WRAPPERS.add(RxJava1SingleWrapper.INSTANCE);
REACTIVE_WRAPPERS.add(RxJava1ObservableWrapper.INSTANCE);
}
if (ReactiveWrappers.isAvailable(ReactiveLibrary.RXJAVA2)) {
REACTIVE_WRAPPERS.add(RxJava2SingleWrapper.INSTANCE);
@@ -341,46 +331,6 @@ public abstract class ReactiveWrapperConverters {
}
}
// -------------------------------------------------------------------------
// RxJava 1 converters
// -------------------------------------------------------------------------
/**
* Wrapper for RxJava 1's {@link Single}.
*/
private enum RxJava1SingleWrapper implements ReactiveTypeWrapper<Single<?>> {
INSTANCE;
@Override
public Class<? super Single<?>> getWrapperClass() {
return Single.class;
}
@Override
public Single<?> map(Object wrapper, Function<Object, Object> function) {
return ((Single<?>) wrapper).map(function::apply);
}
}
/**
* Wrapper for RxJava 1's {@link Observable}.
*/
private enum RxJava1ObservableWrapper implements ReactiveTypeWrapper<Observable<?>> {
INSTANCE;
@Override
public Class<? super Observable<?>> getWrapperClass() {
return Observable.class;
}
@Override
public Observable<?> map(Object wrapper, Function<Object, Object> function) {
return ((Observable<?>) wrapper).map(function::apply);
}
}
// -------------------------------------------------------------------------
// RxJava 2 converters
// -------------------------------------------------------------------------

View File

@@ -35,8 +35,6 @@ import org.springframework.util.ClassUtils;
* <p>
* Supported types are discovered by their availability on the class path. This class is typically used to determine
* multiplicity and whether a reactive wrapper type is acceptable for a specific operation.
* <p>
* <strong>Note:</strong> As of Spring Data 2.4, support for RxJava 1.x is deprecated in favor of RxJava 2 and 3.
*
* @author Mark Paluch
* @author Christoph Strobl
@@ -45,9 +43,6 @@ import org.springframework.util.ClassUtils;
* @author Hantsy Bai
* @since 2.0
* @see org.reactivestreams.Publisher
* @see rx.Single
* @see rx.Observable
* @see rx.Completable
* @see io.reactivex.Single
* @see io.reactivex.Maybe
* @see io.reactivex.Observable
@@ -68,12 +63,6 @@ public abstract class ReactiveWrappers {
private static final boolean PROJECT_REACTOR_PRESENT = ClassUtils.isPresent("reactor.core.publisher.Flux",
ReactiveWrappers.class.getClassLoader());
@Deprecated
private static final boolean RXJAVA1_PRESENT = ClassUtils.isPresent("rx.Observable",
ReactiveWrappers.class.getClassLoader())
&& ClassUtils.isPresent("rx.RxReactiveStreams",
ReactiveWrappers.class.getClassLoader());
@Deprecated
private static final boolean RXJAVA2_PRESENT = ClassUtils.isPresent("io.reactivex.Flowable",
ReactiveWrappers.class.getClassLoader());
@@ -98,17 +87,11 @@ public abstract class ReactiveWrappers {
PROJECT_REACTOR,
/**
* @deprecated since 2.4, use RxJava 3 instead. To be removed with Spring Data 3.0.
*/
@Deprecated
RXJAVA1,
/**
* @deprecated since 2.6, use RxJava 3 instead. To be removed with Spring Data 3.0.
*/
@Deprecated
RXJAVA2, RXJAVA3, KOTLIN_COROUTINES, MUTINY;
RXJAVA2, RXJAVA3, KOTLIN_COROUTINES;
}
/**
@@ -134,8 +117,6 @@ public abstract class ReactiveWrappers {
switch (reactiveLibrary) {
case PROJECT_REACTOR:
return PROJECT_REACTOR_PRESENT;
case RXJAVA1:
return RXJAVA1_PRESENT;
case RXJAVA2:
return RXJAVA2_PRESENT;
case RXJAVA3:

View File

@@ -18,14 +18,14 @@ package org.springframework.data.repository.core.support;
import static java.util.Arrays.*;
import static org.assertj.core.api.Assertions.*;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
import io.vavr.control.Option;
import io.vavr.control.Try;
import lombok.Value;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import rx.Completable;
import rx.Observable;
import rx.Single;
import java.lang.reflect.Method;
import java.math.BigDecimal;
@@ -41,6 +41,7 @@ import java.util.stream.Collectors;
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.Test;
import org.reactivestreams.Publisher;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.repository.Repository;
import org.springframework.data.util.Streamable;
@@ -120,7 +121,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Publisher.class);
Mono<Entity> mono = Mono.from((Publisher<Entity>) result);
assertThat(mono.block()).isEqualTo(entity.toBlocking().value());
assertThat(mono.block()).isEqualTo(entity.blockingGet());
}
@Test // DATACMNS-836
@@ -133,7 +134,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Mono.class);
Mono<Entity> mono = (Mono<Entity>) result;
assertThat(mono.block()).isEqualTo(entity.toBlocking().value());
assertThat(mono.block()).isEqualTo(entity.blockingGet());
}
@Test // DATACMNS-836
@@ -146,7 +147,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Flux.class);
Flux<Entity> flux = (Flux<Entity>) result;
assertThat(flux.next().block()).isEqualTo(entity.toBlocking().value());
assertThat(flux.next().block()).isEqualTo(entity.blockingGet());
}
@Test // DATACMNS-836
@@ -159,7 +160,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Publisher.class);
Mono<Entity> mono = Mono.from((Publisher<Entity>) result);
assertThat(mono.block()).isEqualTo(entity.toBlocking().first());
assertThat(mono.block()).isEqualTo(entity.blockingFirst());
}
@Test // DATACMNS-836
@@ -172,7 +173,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Mono.class);
Mono<Entity> mono = (Mono<Entity>) result;
assertThat(mono.block()).isEqualTo(entity.toBlocking().first());
assertThat(mono.block()).isEqualTo(entity.blockingFirst());
}
@Test // DATACMNS-836
@@ -185,7 +186,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Flux.class);
Flux<Entity> flux = (Flux<Entity>) result;
assertThat(flux.next().block()).isEqualTo(entity.toBlocking().first());
assertThat(flux.next().block()).isEqualTo(entity.blockingFirst());
}
@Test // DATACMNS-836
@@ -198,7 +199,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Single.class);
Single<Entity> single = (Single<Entity>) result;
assertThat(single.toBlocking().value()).isEqualTo(entity.toBlocking().first());
assertThat(single.blockingGet()).isEqualTo(entity.blockingFirst());
}
@Test // DATACMNS-836
@@ -211,7 +212,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Observable.class);
Observable<Entity> observable = (Observable<Entity>) result;
assertThat(observable.toBlocking().first()).isEqualTo(entity.toBlocking().value());
assertThat(observable.blockingFirst()).isEqualTo(entity.blockingGet());
}
@Test // DATACMNS-836
@@ -224,7 +225,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Single.class);
Single<Entity> single = (Single<Entity>) result;
assertThat(single.toBlocking().value()).isEqualTo(entity.block());
assertThat(single.blockingGet()).isEqualTo(entity.block());
}
@Test // DATACMNS-836
@@ -237,7 +238,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Completable.class);
Completable completable = (Completable) result;
assertThat(completable.get()).isNull();
completable.blockingAwait();
}
@Test // DATACMNS-836
@@ -250,7 +251,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Completable.class);
Completable completable = (Completable) result;
assertThat(completable.get()).isInstanceOf(InvalidDataAccessApiUsageException.class);
assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(completable::blockingAwait);
}
@Test // DATACMNS-836
@@ -290,7 +291,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Observable.class);
Observable<Entity> observable = (Observable<Entity>) result;
assertThat(observable.toBlocking().first()).isEqualTo(entity.block());
assertThat(observable.blockingFirst()).isEqualTo(entity.block());
}
@Test // DATACMNS-836
@@ -303,7 +304,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Single.class);
Single<Entity> single = (Single<Entity>) result;
assertThat(single.toBlocking().value()).isEqualTo(entity.next().block());
assertThat(single.blockingGet()).isEqualTo(entity.next().block());
}
@Test // DATACMNS-836
@@ -316,7 +317,7 @@ class QueryExecutionResultHandlerUnitTests {
assertThat(result).isInstanceOf(Observable.class);
Observable<Entity> observable = (Observable<Entity>) result;
assertThat(observable.toBlocking().first()).isEqualTo(entity.next().block());
assertThat(observable.blockingFirst()).isEqualTo(entity.next().block());
}
@Test // DATACMNS-836

View File

@@ -17,10 +17,8 @@ package org.springframework.data.repository.core.support;
import static org.assertj.core.api.Assertions.*;
import io.reactivex.Completable;
import io.reactivex.Flowable;
import reactor.core.publisher.Flux;
import rx.Observable;
import java.lang.reflect.Method;
@@ -29,7 +27,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.reactivestreams.Publisher;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.data.repository.reactive.ReactiveSortingRepository;
@@ -47,26 +44,6 @@ class ReactiveRepositoryInformationUnitTests {
static final Class<ReactiveJavaInterfaceWithGenerics> BASE_CLASS = ReactiveJavaInterfaceWithGenerics.class;
@Test // DATACMNS-836
void discoversRxJava1MethodWithoutComparingReturnType() throws Exception {
Method reference = extractTargetMethodFromRepository(RxJava1InterfaceWithGenerics.class, "deleteAll");
assertThat(reference.getDeclaringClass()).isEqualTo(ReactiveCrudRepository.class);
assertThat(reference.getName()).isEqualTo("deleteAll");
}
@Test // DATACMNS-836
void discoversRxJava1MethodWithConvertibleArguments() throws Exception {
Method reference = extractTargetMethodFromRepository(RxJava1InterfaceWithGenerics.class, "saveAll",
Observable.class);
assertThat(reference.getDeclaringClass()).isEqualTo(ReactiveCrudRepository.class);
assertThat(reference.getName()).isEqualTo("saveAll");
assertThat(reference.getParameterTypes()[0]).isEqualTo(Publisher.class);
}
@Test // DATACMNS-988
void discoversRxJava2MethodWithoutComparingReturnType() throws Exception {
@@ -136,13 +113,6 @@ class ReactiveRepositoryInformationUnitTests {
return composition.findMethod(repositoryType.getMethod(methodName, args)).get();
}
interface RxJava1InterfaceWithGenerics extends Repository<User, String> {
Observable<User> saveAll(Observable<User> entities);
Completable deleteAll();
}
interface RxJava2InterfaceWithGenerics extends RxJava2CrudRepository<User, String> {}
interface ReactiveJavaInterfaceWithGenerics extends ReactiveCrudRepository<User, String> {}

View File

@@ -15,13 +15,12 @@
*/
package org.springframework.data.repository.core.support;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import io.reactivex.Completable;
import io.reactivex.Maybe;
import io.reactivex.rxjava3.core.Single;
import reactor.core.publisher.Mono;
import rx.Single;
import java.io.Serializable;
@@ -32,7 +31,6 @@ import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import org.reactivestreams.Publisher;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.reactive.ReactiveSortingRepository;
@@ -67,32 +65,6 @@ class ReactiveWrapperRepositoryFactorySupportUnitTests {
verify(backingRepo, times(0)).findById(1);
}
@Test // DATACMNS-836, DATACMNS-1154
void callsRxJava1MethodOnBaseImplementationWithExactArguments() {
Serializable id = 1L;
when(backingRepo.existsById(id)).thenReturn(Mono.just(true));
RxJava1ConvertingRepository repository = factory.getRepository(RxJava1ConvertingRepository.class);
repository.existsById(id);
repository.existsById((Long) id);
verify(backingRepo, times(2)).existsById(id);
}
@Test // DATACMNS-836, DATACMNS-1063, DATACMNS-1154
@SuppressWarnings("unchecked")
void callsRxJava1MethodOnBaseImplementationWithTypeConversion() {
when(backingRepo.existsById(any(Publisher.class))).thenReturn(Mono.just(true));
Single<Long> ids = Single.just(1L);
RxJava1ConvertingRepository repository = factory.getRepository(RxJava1ConvertingRepository.class);
repository.existsById(ids);
verify(backingRepo, times(1)).existsById(any(Publisher.class));
}
@Test // DATACMNS-988, DATACMNS-1154
void callsRxJava2MethodOnBaseImplementationWithExactArguments() {
@@ -118,14 +90,6 @@ class ReactiveWrapperRepositoryFactorySupportUnitTests {
verify(backingRepo, times(1)).deleteById(id);
}
interface RxJava1ConvertingRepository extends Repository<Object, Long> {
Single<Boolean> existsById(Single<Long> id);
Single<Boolean> existsById(Serializable id);
Single<Boolean> existsById(Long id);
}
interface RxJava2ConvertingRepository extends Repository<Object, Long> {

View File

@@ -17,7 +17,7 @@ package org.springframework.data.repository.query;
import static org.assertj.core.api.Assertions.*;
import rx.Single;
import io.reactivex.rxjava3.core.Single;
import java.lang.reflect.Method;
import java.util.Optional;

View File

@@ -19,12 +19,12 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import io.reactivex.Flowable;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
import lombok.Getter;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import rx.Observable;
import rx.Single;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -241,7 +241,7 @@ class ResultProcessorUnitTests {
assertThat(result).isInstanceOf(Single.class);
Object content = ((Single<Object>) result).toBlocking().value();
Object content = ((Single<Object>) result).blockingGet();
assertThat(content).isInstanceOf(Sample.class);
}
@@ -288,7 +288,7 @@ class ResultProcessorUnitTests {
assertThat(result).isInstanceOf(Observable.class);
List<Object> content = ((Observable<Object>) result).toList().toBlocking().single();
List<Object> content = ((Observable<Object>) result).toList().blockingGet();
assertThat(content).isNotEmpty();
assertThat(content.get(0)).isInstanceOf(SampleProjection.class);

View File

@@ -18,15 +18,15 @@ package org.springframework.data.repository.util;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.repository.util.QueryExecutionConverters.*;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
import io.vavr.collection.Seq;
import io.vavr.control.Try;
import io.vavr.control.Try.Failure;
import lombok.Value;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import rx.Completable;
import rx.Observable;
import rx.Single;
import scala.Option;
import java.io.IOException;

View File

@@ -26,9 +26,6 @@ import kotlinx.coroutines.reactive.ReactiveFlowKt;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import rx.Completable;
import rx.Observable;
import rx.Single;
import org.junit.jupiter.api.Test;
import org.reactivestreams.Publisher;
@@ -50,14 +47,6 @@ class ReactiveWrapperConvertersUnitTests {
assertThat(ReactiveWrapperConverters.supports(Object.class)).isFalse();
}
@Test // DATACMNS-836
void shouldSupportRxJava1Types() {
assertThat(ReactiveWrapperConverters.supports(Single.class)).isTrue();
assertThat(ReactiveWrapperConverters.supports(Observable.class)).isTrue();
assertThat(ReactiveWrapperConverters.supports(Completable.class)).isTrue();
}
@Test // DATACMNS-836
void shouldSupportRxJava2Types() {
@@ -99,13 +88,6 @@ class ReactiveWrapperConvertersUnitTests {
assertThat(ReactiveWrapperConverters.toWrapper(foo, Mono.class)).isSameAs(foo);
}
@Test // DATACMNS-836
void toWrapperShouldConvertMonoToRxJava1Single() {
Mono<String> foo = Mono.just("foo");
assertThat(ReactiveWrapperConverters.toWrapper(foo, Single.class)).isInstanceOf(Single.class);
}
@Test // DATACMNS-836
void toWrapperShouldConvertMonoToRxJava2Single() {
@@ -245,22 +227,6 @@ class ReactiveWrapperConvertersUnitTests {
assertThat(map.next().block()).isEqualTo(1L);
}
@Test // DATACMNS-836
void shouldMapRxJava1Single() {
Single<String> foo = Single.just("foo");
Single<Long> map = ReactiveWrapperConverters.map(foo, source -> 1L);
assertThat(map.toBlocking().value()).isEqualTo(1L);
}
@Test // DATACMNS-836
void shouldMapRxJava1Observable() {
Observable<String> foo = Observable.just("foo");
Observable<Long> map = ReactiveWrapperConverters.map(foo, source -> 1L);
assertThat(map.toBlocking().first()).isEqualTo(1L);
}
@Test // DATACMNS-836
void shouldMapRxJava2Single() {

View File

@@ -21,8 +21,6 @@ import io.reactivex.Completable;
import io.reactivex.Flowable;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import rx.Observable;
import rx.Single;
import java.util.concurrent.CompletableFuture;
@@ -43,10 +41,8 @@ class ReactiveWrappersUnitTests {
assertThat(ReactiveWrappers.isNoValueType(Mono.class)).isFalse();
assertThat(ReactiveWrappers.isNoValueType(Flux.class)).isFalse();
assertThat(ReactiveWrappers.isNoValueType(Single.class)).isFalse();
assertThat(ReactiveWrappers.isNoValueType(Completable.class)).isTrue();
assertThat(ReactiveWrappers.isNoValueType(CompletableFuture.class)).isFalse();
assertThat(ReactiveWrappers.isNoValueType(Observable.class)).isFalse();
assertThat(ReactiveWrappers.isNoValueType(Publisher.class)).isFalse();
assertThat(ReactiveWrappers.isNoValueType(io.reactivex.Single.class)).isFalse();
assertThat(ReactiveWrappers.isNoValueType(io.reactivex.Maybe.class)).isFalse();
@@ -65,10 +61,8 @@ class ReactiveWrappersUnitTests {
assertThat(ReactiveWrappers.isSingleValueType(Mono.class)).isTrue();
assertThat(ReactiveWrappers.isSingleValueType(Flux.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(Single.class)).isTrue();
assertThat(ReactiveWrappers.isSingleValueType(Completable.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(CompletableFuture.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(Observable.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(Publisher.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.Single.class)).isTrue();
assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.Completable.class)).isFalse();
@@ -89,10 +83,8 @@ class ReactiveWrappersUnitTests {
assertThat(ReactiveWrappers.isMultiValueType(Mono.class)).isFalse();
assertThat(ReactiveWrappers.isMultiValueType(Flux.class)).isTrue();
assertThat(ReactiveWrappers.isMultiValueType(Single.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(Completable.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(CompletableFuture.class)).isFalse();
assertThat(ReactiveWrappers.isMultiValueType(Observable.class)).isTrue();
assertThat(ReactiveWrappers.isMultiValueType(Publisher.class)).isTrue();
assertThat(ReactiveWrappers.isMultiValueType(io.reactivex.Single.class)).isFalse();
assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.Completable.class)).isFalse();

View File

@@ -18,6 +18,8 @@ package org.springframework.data.repository.kotlin
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.toList
@@ -34,8 +36,6 @@ import org.springframework.data.repository.reactive.ReactiveCrudRepository
import org.springframework.data.repository.sample.User
import reactor.core.publisher.Flux
import reactor.core.publisher.Mono
import rx.Observable
import rx.Single
/**
* Unit tests for Coroutine repositories.