Ich implementiere einen instrumentierten Test, um eine Datenbank-Datenquellenklasse zu testen, die Realm verwendet. So, jetzt habe ich einige Probleme, wie man Fixtures benutzt und wie man Realm verspottet. Meine Datenbank-Datenquelle wie folgt aussieht:Instrumentierter Test mit Realm fehlgeschlagen
public class DatabaseDataSource {
private Realm realm;
public DatabaseDataSource(Realm realm) {
this.realm = realm;
}
public Observable<RealmResults> getContacts(String firstName, String lastName, String city, String zipCode) {
final RealmQuery realmQuery = realm.where(Contact.class);
if(!TextUtils.isEmpty(firstName)) {
realmQuery.contains("firstName", firstName);
}
if(!TextUtils.isEmpty(lastName)) {
realmQuery.contains("lastName", lastName));
}
if(!TextUtils.isEmpty(city)) {
realmQuery.contains("city", city);
}
if(!TextUtils.isEmpty(zipCode)) {
realmQuery.contains("zipCode", zipCode);
}
return realmQuery.findAll()
.asObservable();
}
}
ich eine Liste von Kontakten in meinem verspottet Reich haben will, damit ich, dass die Filterung funktioniert prima überprüfen. Wie kann ich das machen? Ich habe versucht zu tun:
@RunWith(AndroidJUnit4.class)
public class DatabaseDataSourceTest extends BaseInstrumentedTest{
private DatabaseDataSource databaseDataSource;
private List<Contact> contacts;
@Before
public void setup() {
Realm.init(InstrumentationRegistry.getTargetContext());
Realm.setDefaultConfiguration(new RealmConfiguration.Builder().build());
databaseDataSource = new DatabaseDataSource(new DatabaseClient());
}
@Test
public void trial() throws Exception {
subscribeContactsListObservable(databaseDataSource.getContacts("firstName", null, null, null));
assertEquals(2, contacts.size());
}
private void subscribeContactsListObservable(final Observable<RealmResults> observable) {
notaries = null;
observable.map(new Func1<RealmResults, List<Contact>>() {
@Override
public List<Notary> call(RealmResults realmResults) {
return realmResults != null? new ArrayList<>(realmResults) : null;
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Contact>>() {
@Override
public void onCompleted() {
contacts = null;
}
@Override
public void onError(Throwable e) {
contacts = null;
}
@Override
public void onNext(List<Contact> contactsList) {
contacts = contactsList;
}
});
}
}
Aber der Test nicht bestehen, wenn die Observable.subscribe mit folgenden Ausnahme machen:
You can't register a listener from a non-Looper thread or IntentService thread.
Was kann ich tun?
Vielen Dank im Voraus
Vielen Dank, ich habe es gelöst mit: InstrumentationRegistry .getInstrumentation(). runOnMainSync() – FVod
Das funktioniert auch, der Haupt-Thread ist ein Looper-Thread :) – EpicPandaForce