2016-02-02 14 views
5

Próbując badanej jednostki klasy, która ma kilka połączeń do Realm (0.87.4), setup test nie powiedzie się zRealm Test jednostki na Androida

java.lang.NoClassDefFoundError: rx/Observable$OnSubscribe 
at io.realm.RealmConfiguration$Builder.<init>(RealmConfiguration.java:279) 
at org.testapp.db.MyClassTest.setUp(MyClassTest.java:34) 
... 
Caused by: java.lang.ClassNotFoundException: rx.Observable$OnSubscribe 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 

Moja klasa Test rozpoczyna się:

@RunWith(MockitoJUnitRunner.class) 
public class MyClassTest extends TestCase { 

@Rule 
public TemporaryFolder testFolder = new TemporaryFolder(); 

Realm realm; 

@Before 
public void setUp() throws Exception { 
    File tempFolder = testFolder.newFolder("realmdata"); 
    RealmConfiguration config = new RealmConfiguration.Builder(tempFolder).build(); 

    realm = Realm.getInstance(config); 
} 
... 

Moje gradle ma:

testCompile 'junit:junit:4.12' 
testCompile "org.mockito:mockito-core:1.10.19" 
testCompile "org.robolectric:robolectric:3.0" 
compile 'io.realm:realm-android:0.87.4' 

Jak rozwiązać ten problem?

=== EDIT 1 ===

dodałem do mojego Gradle:

testCompile 'io.reactivex:rxjava:1.1.0' 

i

android { 
    // ... 
    testOptions { 
    unitTests.returnDefaultValues = true 
    } 
} 

nowy błąd jest

java.lang.UnsatisfiedLinkError: no realm-jni in java.library.path 
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) 
at java.lang.Runtime.loadLibrary0(Runtime.java:849) 
at java.lang.System.loadLibrary(System.java:1088) 
at io.realm.internal.RealmCore.loadLibrary(RealmCore.java:117) 

Odpowiedz

7

Testy jednostkowe są trudne lub niemożliwe przy użyciu Realm w klasie, które testujemy (dzięki Dmitry dla wspomnieć). Co mogę zrobić, to uruchomić testy jako testy instrumentalne (dziękuję Dmitry, Christian).

I to jest dość łatwe, nie trzeba zmieniać niczego do metod testowych ...

A. Przesuń klasę testową do folderu „androidTest”, zamiast „Test”. (Ponieważ Android Studio 1.1 powinieneś umieścić Testy jednostek w/src/test i Android Instrumentation Tests w/src/androidTest)

B. Dodaj zależności dla testów instrumentalnych w pliku gradle, użyj "androidTest", ponieważ „ponownego instrumentalna:

androidTestCompile 'junit:junit:4.12' 
androidTestCompile 'io.reactivex:rxjava:1.1.0' 
androidTestCompile 'com.android.support.test:runner:0.4.1' 
androidTestCompile 'com.android.support.test:rules:0.4.1' 
androidTestCompile 'com.android.support:support-annotations:23.1.1' 

C w klasie testowej wymiany lekkoatleta w górę z AndroidJUnit4:

@RunWith(AndroidJUnit4.class) 
public class MyClassTest extends TestCase { 
... 

Tworzenie Android konfiguracji typu«run Android Testy»uruchomić voila , przetestuje teraz te same metody, ale na urządzeniu. Bardzo mnie to cieszy.

+0

Tak, jedynym sposobem jest skorzystanie z Android InstrumentTest, dziękuję za odpowiedź, a ja po prostu chcę dostarczyć więcej informacji na temat uruchamiania testów jednostkowych za pomocą Robolectric and Realm, proszę kliknąć ten link: https://realm.io/docs/java/ ostatnie/# robolectric – TranVo

2

Od Realm 0.87 trzeba także zawierać RxJava do zależności:

compile 'io.reactivex:rxjava:1.1.0' 
+0

OK. Dodałem go i popełniłem kolejny błąd. Zaktualizowałem swój post. – Frank

+0

@Frank nie będzie można uruchomić testów jednostek w bazie danych Realm na komputerze, ponieważ Realm zależy od biblioteki JNI zbudowanej dla Androida. Musisz uruchomić je na urządzeniu z systemem Android. –

+2

Istnieje przykładowy projekt pokazujący różne sposoby testowania jednostkowego, ale każdy kod, który dotyka natywnych metod, może być uruchamiany tylko w testach instrumentacyjnych: https://github.com/realm/realm-java/tree/master/examples/unitTestExample –

Powiązane problemy