2016-10-27 10 views
1

У меня есть источник данных базы данных, который использует Realm. Итак, теперь я хочу протестировать этот класс, но мне приходится сталкиваться с некоторыми проблемами о том, как использовать приборы и как имитировать Realm. Мой источник данных базы данных выглядит следующим образом:Метод тестирования, который использует Realm

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(); 
    } 
} 

Я использую Robolectrics для других тестов, и, в данном случае, я хочу иметь список контактов в моей издевались области, так что я могу проверить, что фильтрация работает хорошо. Как я могу это сделать? Я пробовал делать:

@RunWith(RobolectricTestRunner.class) 
@Config(manifest=Config.NONE) 
public class DatabaseDataSourceTest extends BaseTest { 


    private DatabaseDataSource databaseDataSource; 

    Realm realm; 

    @Before 
    public void setup() throws Exception { 

     Realm.init(RuntimeEnvironment.application.getApplicationContext()); 
     Realm.setDefaultConfiguration(new RealmConfiguration.Builder().build()); 
     realm = Realm.getDefaultInstance(); 

     databaseDataSource = new DatabaseDataSource(realm); 
    } 

    @Test 
    public void getContacts_filterByName() { 
    databaseDataSource.getContacts("testName", null, null, null); 
     // I don't know what to do here 
    } 

} 

Но я получаю следующее исключение при выполнении:

Realm.init(RuntimeEnvironment.application.getApplicationContext()); 

java.lang.UnsatisfiedLinkError: Can't load library: /var/folders/kc/76n8494x5cd2mtx340f27xch0000gn/T/android-tmp-robolectric409019390257818503/app_lib/librealm-jni.dylib 

Как я должен это делать?

ответ

1

How to run Unit test in Realm Db using Roboelectric говорит, что Roboelectric еще не поддерживается, поэтому вы не можете использовать модульное тестирование, только инструментальные тесты на реальном устройстве Android.

Все тесты могут выполняться по одной теме, в тестах нет необходимости в rx.

0

https://medium.com/@q2ad/android-testing-realm-2dc1e1c94ee1 имеет большое разрешение: не высмеивать Realm, просто использовать временную область:

RealmConfiguration testConfig = 
    new RealmConfiguration.Builder(). 
     inMemory(). 
     name("test-realm").build(); 

Realm testRealm = Realm.getInstance(testConfig); 

Используйте этот f.ex. в @BeforeClass (и не забудьте указать testRealm.close() в @AfterClass для хорошей формы).