【发布时间】:2018-06-16 20:13:39
【问题描述】:
我在组合 BehaviorSubject 和 Observable.combineLatest 时遇到了一些问题。我能够在(较小的)测试中重现它。这是一个当前失败的测试:
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.observers.TestObserver;
import io.reactivex.subjects.BehaviorSubject;
import io.reactivex.subjects.Subject;
import static java.util.Collections.singletonList;
public class MyTest {
@Test
public void test() {
Subject<Integer> intSource = BehaviorSubject.createDefault(1);
Subject<List<Observable<Integer>>> mainSubject =
BehaviorSubject.createDefault(singletonList(intSource));
TestObserver<List<Integer>> testObserver =
mainSubject.flatMap(observables ->
Observable.combineLatest(observables, this::castObjectsToInts)
)
.test();
List<Observable<Integer>> newValue = new ArrayList<>();
newValue.add(intSource); // same value as before
newValue.add(Observable.just(2)); // add another value to this list.
mainSubject.onNext(newValue);
// intSource was already '1', but this is just to 'update' it.
intSource.onNext(1); // COMMENT OUT THIS LINE
testObserver.assertValueAt(0, singletonList(1));
testObserver.assertValueAt(1, Arrays.asList(1, 2));
testObserver.assertValueAt(2, Arrays.asList(1, 2)); // COMMENT OUT THIS LINE
testObserver.assertValueCount(3); // REPLACE 3 WITH 2
}
private List<Integer> castObjectsToInts(Object[] objects) {
List<Integer> ints = new ArrayList<>(objects.length);
for (Object object : objects) {
ints.add((Integer) object);
}
return ints;
}
}
(如果您用“COMMENT OUT THIS LINE”注释掉这两行,并将最后的3 替换为2,则测试成功。)
为什么这个测试失败了?我看不出代码有什么问题。
【问题讨论】:
标签: java android unit-testing rx-java rx-java2