I have written unit test for below class. The TestObserver in the test is not able to receive any data. I'm clueless as to what needs to be done.
public class DataLocationMonitor {
private PublishSubject<Object> dataLocatorSubject;
public DataLocationMonitor(...) {
this.dataLocatorSubject = PublishSubject.create();
}
public Observable<Object> getObservable() {
return this.dataLocatorSubject;
}
public void handleData(Object data) {
if (data instanceof DataMessage) {
DataMessage message = new DataMessage(...);
this.dataLocatorSubject.onNext(message);
}
}
}
@RunWith(MockitoJUnitRunner.class)
public class DataLocationMonitorTest {
private DataLocationMonitor target;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
this.target = new DataLocationMonitor(...);
}
@Test
public void handleData_dataLocatorSubjectOnNextCalled() {
TestObserver<Object> observer= TestObserver.create();
Observable<Object> dataLocatorSubject = this.target.getObservable();
DataMessage data = new DataMessage();
this.target.handleData(data);
dataLocatorSubject.subscribe(observer);
observer.assertSubscribed();
observer.awaitCount(1);
observer.assertValueCount(1);
}
}
When I run the test I get java.lang.AssertionError: Value counts differ; Expected: 1, Actual: 0 (latch = 1, values = 0, errors = 0, completions = 0, timeout!)
Swap the order of this.target.handleData and dataLocatorSubject.subscribe lines. PublishSubject doesn't retain items passing through so a late subscriber won't see any previously onNext'd items.
TestObserver<Object> observer= TestObserver.create();
Observable<Object> dataLocatorSubject = this.target.getObservable();
DataMessage data = new DataMessage();
// subscribe first
dataLocatorSubject.subscribe(observer);
// signal next
this.target.handleData(data);
observer.assertSubscribed();
observer.awaitCount(1);
observer.assertValueCount(1);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With