2015-05-20 4 views
3

Я бегу Robolectric 3 RC3 и я не смог запустить Robolectric тест из-за это NoClassDefFoundError на Context.Robolectric 3 NoClassDefFoundError на контексте

Это хорошо работало неделю назад. Я обнаружил, что проблема связана с here, которая по-видимому связана, но я не хочу понижать AS.

Вот мой конфиг:

Модуль Gradle:

// Testing dependencies 
testCompile 'org.apache.maven:maven-ant-tasks:2.1.3' 
testCompile ("org.robolectric:robolectric:3.0-rc3"){ 
    exclude module: 'commons-logging' 
    exclude module: 'httpclient' 
} 
testCompile 'com.google.android.gms:play-services:7.0.0' 
testCompile ("org.robolectric:shadows-play-services:3.0-rc3"){ 
    exclude module: 'commons-logging' 
    exclude module: 'httpclient' 
} 
testCompile 'org.robolectric:shadows-support-v4:3.0-rc3' 
testCompile 'org.assertj:assertj-core:1.7.0' 
testCompile 'com.squareup.okhttp:mockwebserver:1.2.1' 

Sample класс Unit Test:

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class AdServerClientTest { 

    @Test(timeout = 7000) 
    public void testLongTask() { 
     // Fails if the method takes longer than 7 seconds 
     ShadowGooglePlayServicesUtil.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS); 


     assertTrue(false); 
    } 
} 

Исключение ниже:

Exception in thread "main" java.lang.NoClassDefFoundError: android/content/Context 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615) 
    at java.lang.Class.getMethod0(Class.java:2856) 
    at java.lang.Class.getMethod(Class.java:1668) 
    at org.junit.internal.builders.SuiteMethodBuilder.hasSuiteMethod(SuiteMethodBuilder.java:20) 
    at com.intellij.junit4.JUnit46ClassesRequestBuilder.collectWrappedRunners(JUnit46ClassesRequestBuilder.java:79) 
    at com.intellij.junit4.JUnit46ClassesRequestBuilder.getClassesRequest(JUnit46ClassesRequestBuilder.java:51) 
    at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.java:92) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:39) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: java.lang.ClassNotFoundException: android.content.Context 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 16 more 

ОБНОВЛЕНИЕ:

Я сократил тестовый класс только до одного утверждения и сменил Исключение на ошибку Parcelable.

@Test(timeout = 7000) 
public void testLongTask() { 
    assertTrue(false); 
} 

Exception in thread "main" java.lang.NoClassDefFoundError: android/os/Parcelable 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615) 
    at java.lang.Class.getMethod0(Class.java:2856) 
    at java.lang.Class.getMethod(Class.java:1668) 
    at org.junit.internal.builders.SuiteMethodBuilder.hasSuiteMethod(SuiteMethodBuilder.java:20) 
    at com.intellij.junit4.JUnit46ClassesRequestBuilder.collectWrappedRunners(JUnit46ClassesRequestBuilder.java:79) 
    at com.intellij.junit4.JUnit46ClassesRequestBuilder.getClassesRequest(JUnit46ClassesRequestBuilder.java:51) 
    at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.java:92) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:39) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: java.lang.ClassNotFoundException: android.os.Parcelable 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 28 more 

UPDATE 2: Я запускать ./gradlew clean assembleDebug testDebug и результатом является то, java.lang.UnsupportedOperationException: Robolectric does not support API level 22.. Действительно странно, потому что при переключении на robolectric 3-RC3, emulateSdk и reportSdk были удалены: @Config(emulateSdk = 21, reportSdk = 21, constants = BuildConfig.class). Но есть что искать.

+0

Есть причина 'androidTestCompile' не то, что вы хотите? http://stackoverflow.com/questions/16637608/specifying-test-dependencies-with-the-gradle-android-build-system – loosebazooka

+0

@loosebazooka да, в документации так говорится https://github.com/robolectric/robolectric/ wiki/2.4-to-3.0-Upgrade-Guide # modules –

+1

@loosebazooka 'androidTestCompile' для тестов' instrumentation'. –

ответ

2

Изменение Config в yuor тестового класса

@Config(constants = BuildConfig.class,sdk= 21, manifest = "src/main/AndroidManifest.xml") 

потому что org.robolectric:robolectric:3.0-rc3 не поддерживает методы emulateSdk и reportSdk

Смежные вопросы