2013-12-12 6 views
65

Mam test, który chciałbym uruchomić z Robolectric, używam 2.3-SNAPSHOT, ponieważ moja aplikacja używa ActionbarCompat i potrzebuję używać wersji 2.3-SNAPSHOT, ponieważ Robolectric nie mógł wcześniej znaleźć motywów AppCompat. Więc konfiguracja Classpath w Eclipse i skończę z tym:Czy Robolectric obsługuje poziom API?

java.lang.UnsupportedOperationException: Robolectric does not support API level 9, sorry! 
at org.robolectric.SdkConfig.<init>(SdkConfig.java:24) 
at org.robolectric.RobolectricTestRunner.pickSdkVersion(RobolectricTestRunner.java:288) 
at org.robolectric.RobolectricTestRunner.getEnvironment(RobolectricTestRunner.java:264) 
at org.robolectric.RobolectricTestRunner.access$100(RobolectricTestRunner.java:57) 
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:186) 
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:172) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Manifest mojego projektu badania jest tak:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.vendor.test" 
     android:versionCode="1" 
     android:versionName="1.0"> 
     <application> 
      <uses-library android:name="android.test.runner" /> 
     </application> 
     <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> 
     <instrumentation android:name="android.test.InstrumentationTestRunner" 
     android:targetPackage="com.vendor" /> 
</manifest> 

I narzeka zawsze o poziomie API, bez względu na to, co ja posługiwać się.

Ktoś to działa?

+0

ty spróbuj zmienić miniumum sdk do 8 i zobacz? – user2511882

Odpowiedz

80

Aktualizacja: Adnotacja jest teraz @Config(sdk = 18) (lub @Config(sdk = Build.VERSION_CODES.JELLY_BEAN_MR2)) i właściwości pliku wymienione w linku jest teraz robolectric.properties.

Original Odpowiedź: Można użyć @Config adnotacji mieć Robolectric naśladować wersję SDK. Można umieścić to:

import org.robolectric.annotation.Config; 

@Config(emulateSdk = 18) // now @Config(sdk = 18) as of Robolectric 3.0 
@RunWith(RobolectricTestRunner.class) 
public class SomeTest ... 

Jest to również możliwe przy użyciu pliku jak wspomniano here

Nie wiesz, co to znaczy dla KitKat konkretnych testów, ale przynajmniej reszta powinna działać.

+1

To działa dla mnie, nie jest teraz tak ważne, aby być na API 18. Dzięki! – Kitesurfer

+0

dzięki! czy istnieje sposób, aby to ustalić globalnie? Nie chcę ustawiać (i później mam nadzieję, że nie ustawiać) tego przy każdym teście – ligi

+0

Tak. Zgodnie z umieszczonym tam łączem, plik 'org.robolectric.Config.properties' powinien to zrobić dla całego projektu. –

9

Według SdkConfig.java, Roboelectric obsługuje tylko następujące wersje/poziomy API:

SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN, new SdkVersion("4.1.2_r1", "0")); 
SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN_MR1, new SdkVersion("4.2.2_r1.2", "0")); 
SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN_MR2, new SdkVersion("4.3_r2", "0")); 
SUPPORTED_APIS.put(Build.VERSION_CODES.KITKAT, new SdkVersion("4.4_r1", "0")); 
SUPPORTED_APIS.put(Build.VERSION_CODES.LOLLIPOP, new SdkVersion("5.0.0_r2", "0")); 

Czy na pewno próbowali ci?

+3

Zmęczony także 18. Podczas pracy nad niektórymi materiałami związanymi z KitKat muszę korzystać z interfejsu API poziomu 19. – Kitesurfer

+2

Ktoś wie, dlaczego nie obsługuje interfejsu API Level 19? – sirFunkenstine

+0

Przenieśli plik tutaj https://github.com/robolectric/robolectric/blob/master/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java i dodano obsługę wersji 4.4_r1 i 5.0.0_r2 –

27

W przypadku ludzi takich jak ja, ciągle odwiedzając link do podobnego błędu,

@Config(emulateSdk =) nie działa teraz. Jego zmieniona na sdk--
@Config(constants = BuildConfig.class, sdk=21)

dla mnie, byłem coraz błąd z docelowej wersji 22,

java.lang.UnsupportedOperationException: Robolectric does not support API level 22 

a więc emulowane go do 21.

+1

Dzięki! Jak to odkryłeś, proszę? Nie udało mi się znaleźć go nigdzie udokumentowanego. Mam podobne problemy z uaktualnianiem z 3.0-rc2 do 3.0 i czuję, że muszą być gdzieś udokumentowane ...! –

+0

nawet ja waliłam w głowę. Oto krótki opis wiki, może ci się przydać :-) https://github.com/robolectric/robolectric/wiki/2.4-to-3.0-Upgrade-Guide – Nicks