【发布时间】:2016-11-18 11:19:46
【问题描述】:
问题描述
我正在尝试为使用Observable 的简单类编写测试。
必须为函数buildUseCaseObservable 编写测试,该函数应首先尝试从网络获取数据,如果不成功则尝试从本地数据库获取。
在buildUseCaseObservable 中,我正在使用运算符first,它应该过滤数据并在数据不为空且不为空时返回true。
如果在rest.getData() 的情况下被调用并且返回的数据不为空,我假设first 应该返回true,在这种情况下data.getData() 不应该被调用。
但在我的情况下,似乎没有调用测试函数 first 并且始终调用两个函数 rest.getData() 和 data.getData()。
问题
我做错了什么以及如何纠正测试?
DataInteractor.java
@PerActivity
public class DataInteractor extends Interactor {
private RestService rest;
private DataService data;
@Inject
DataInteractor(RestService rest, DataService data) {
this.rest = rest;
this.data = data;
}
@Override
protected Observable buildUseCaseObservable() {
return Observable.concat(
rest.getData(),
data.getData())
.first(data -> data != null && !data.isEmpty());
}
}
DataService.java
public interface DataService {
Observable<List<IData>> getData();
}
RestService.java
public interface RestService {
@GET("data")
Observable<List<IData>> getData();
}
DataInteractorTest.java
public class DataInteractorTest {
private DataInteractor interactor;
@Mock private RestService mockedRest;
@Mock private DataService mockedData;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.interactor = new DataInteractor(mockedRest, mockedData);
}
@Test
public void firstDownloadDataFromNetwork() {
when(mockedRest.getData()).thenReturn(Observable.create(new Observable.OnSubscribe<List<IData>>() {
@Override
public void call(Subscriber<? super List<IData>> subscriber)
List<IData> data = new ArrayList<IData>() {{
add(new Data());
}};
subscriber.onNext(data);
subscriber.onCompleted();
}
}));
this.interactor.buildUseCaseObservable()
verify(this.mockedData, times(0)).getData();
}
}
【问题讨论】:
-
也许我是盲人,但您的测试的哪一部分会真正触发对 buildUseCaseObservable() 的调用?
-
@GhostCat 我的错 :( 抱歉,我添加了一部分,就在创建这篇文章时,我正在玩代码并且显然删除了调用。
-
我不太喜欢 Mokito;但对我来说,这段代码看起来不错。也许您应该考虑将标签 ... 更改为 JUnit,并可能添加 Mokito - 以吸引一些更专业的用户。
-
@GhostCat 我找到了解决方案,如果您有兴趣可以检查一下,一般问题是多线程,您不能以这种方式测试 Rx 的东西(以我想要的方式)
标签: android unit-testing rx-java observable