Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TestObserver not getting data in Unit Test

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!)

like image 268
user1184100 Avatar asked Jun 04 '26 21:06

user1184100


1 Answers

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);
like image 119
akarnokd Avatar answered Jun 07 '26 10:06

akarnokd



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!