java - NoClassDefFoundError: ... R$styleable when using Robolectric with Android Library (AAR) -


we developing library provides activity, , able perform functional testing on activity.

my build.gradle includes:

dependencies {     compile filetree(dir: 'libs', include: ['*.jar'])     compile 'com.android.support:appcompat-v7:22.1.1'      testcompile 'org.mockito:mockito-core:1.+'     testcompile 'junit:junit:4.12'     testcompile('org.robolectric:robolectric:3.0-rc2') {         exclude group: 'commons-logging', module: 'commons-logging'         exclude group: 'org.apache.httpcomponents', module: 'httpclient'     }     testcompile('org.robolectric:shadows-httpclient:3.0-rc2') {         exclude group: 'commons-logging', module: 'commons-logging'         exclude group: 'org.apache.httpcomponents', module: 'httpclient'     }     testcompile('org.robolectric:shadows-support-v4:3.0-rc2') {         exclude group: 'commons-logging', module: 'commons-logging'         exclude group: 'org.apache.httpcomponents', module: 'httpclient'     } } 

and libraryactivitytest includes:

@runwith(robolectricgradletestrunner.class) public class libraryactivitytest {      @test     public void testoncreate() throws exception {         libraryactivity libraryactivity = robolectric.buildactivity(libraryactivity.class).create().get();       } } 

myrobolectricgradletestrunner overrides getappmanifest restore ability specify test-specific androidmanifest.xml instead of using application version.

when attempt run testoncreate android studio or gradle command line, class def not found error android/support/v7/appcompat/r$styleable:

android/support/v7/appcompat/r$styleable java.lang.noclassdeffounderror: android/support/v7/appcompat/r$styleable     @ android.support.v7.app.appcompatdelegateimplbase.oncreate(appcompatdelegateimplbase.java:109)     @ android.support.v7.app.appcompatdelegateimplv7.oncreate(appcompatdelegateimplv7.java:146)     @ android.support.v7.app.appcompatactivity.oncreate(appcompatactivity.java:59)     @ com.moxiesoft.mylibrary.libraryactivity.oncreate(libraryactivity.java:13)     @ android.app.activity.performcreate(activity.java:5133)     @ org.robolectric.util.reflectionhelpers$3.run(reflectionhelpers.java:144)     @ org.robolectric.util.reflectionhelpers.traverseclasshierarchy(reflectionhelpers.java:241)     @ org.robolectric.util.reflectionhelpers.callinstancemethod(reflectionhelpers.java:138)     @ org.robolectric.util.activitycontroller$1.run(activitycontroller.java:122)     @ org.robolectric.shadows.shadowlooper.runpaused(shadowlooper.java:309)     @ org.robolectric.shadows.coreshadowsadapter$2.runpaused(coreshadowsadapter.java:47)     @ org.robolectric.util.activitycontroller.create(activitycontroller.java:118)     @ org.robolectric.util.activitycontroller.create(activitycontroller.java:129)     @ com.moxiesoft.mylibrary.libraryactivitytest.testoncreate(libraryactivitytest.java:20)     @ org.junit.runners.model.frameworkmethod$1.runreflectivecall(frameworkmethod.java:50)     @ org.junit.internal.runners.model.reflectivecallable.run(reflectivecallable.java:12)     @ org.junit.runners.model.frameworkmethod.invokeexplosively(frameworkmethod.java:47)     @ org.junit.internal.runners.statements.invokemethod.evaluate(invokemethod.java:17)     @ org.robolectric.robolectrictestrunner$2.evaluate(robolectrictestrunner.java:235)     @ org.junit.runners.parentrunner.runleaf(parentrunner.java:325)     @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:78)     @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:57)     @ org.junit.runners.parentrunner$3.run(parentrunner.java:290)     @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:71)     @ org.junit.runners.parentrunner.runchildren(parentrunner.java:288)     @ org.junit.runners.parentrunner.access$000(parentrunner.java:58)     @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:268)     @ org.robolectric.robolectrictestrunner$1.evaluate(robolectrictestrunner.java:168)     @ org.junit.runners.parentrunner.run(parentrunner.java:363)     @ org.gradle.api.internal.tasks.testing.junit.junittestclassexecuter.runtestclass(junittestclassexecuter.java:86)     @ org.gradle.api.internal.tasks.testing.junit.junittestclassexecuter.execute(junittestclassexecuter.java:49)     @ org.gradle.api.internal.tasks.testing.junit.junittestclassprocessor.processtestclass(junittestclassprocessor.java:69)     @ org.gradle.api.internal.tasks.testing.suitetestclassprocessor.processtestclass(suitetestclassprocessor.java:48)     @ org.gradle.messaging.dispatch.reflectiondispatch.dispatch(reflectiondispatch.java:35)     @ org.gradle.messaging.dispatch.reflectiondispatch.dispatch(reflectiondispatch.java:24)     @ org.gradle.messaging.dispatch.contextclassloaderdispatch.dispatch(contextclassloaderdispatch.java:32)     @ org.gradle.messaging.dispatch.proxydispatchadapter$dispatchinginvocationhandler.invoke(proxydispatchadapter.java:93)     @ com.sun.proxy.$proxy2.processtestclass(unknown source)     @ org.gradle.api.internal.tasks.testing.worker.testworker.processtestclass(testworker.java:105)     @ org.gradle.messaging.dispatch.reflectiondispatch.dispatch(reflectiondispatch.java:35)     @ org.gradle.messaging.dispatch.reflectiondispatch.dispatch(reflectiondispatch.java:24)     @ org.gradle.messaging.remote.internal.hub.messagehub$handler.run(messagehub.java:360)     @ org.gradle.internal.concurrent.defaultexecutorfactory$stoppableexecutorimpl$1.run(defaultexecutorfactory.java:64)     @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142)     @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617)     @ java.lang.thread.run(thread.java:745) 

it's worth noting installation , configuration seems reasonable, tests don't involve activitycontroller.create seem work fine.

how can resolve error?

so root of problem seems how gradle (or not) handle creating android/support/v7/appcompat/r.java com.android.library modules.

with clues here able things working both command line , android putting chunk in build.gradle

def package_namespace = "com.moxiesoft.netagent.androidchatcustomerclient" def package_namespace_path = package_namespace.replaceall("\\.", "/")  afterevaluate { project ->     android.libraryvariants.each { variant ->         // workaround missing r class aar dependencies         def copytaskname = "copy${variant.name.capitalize()}appcompat"         task(copytaskname, type:copy) {             dependson "process${variant.name.capitalize()}resources"             "build/generated/source/r/${variant.name}/$package_namespace_path" //            "build/generated/source/r/${variant.name}/android/support/v7/appcompat"             "src/test/java/android/support/v7/appcompat"             include 'r.java'             filter { line -> line.contains("package ${package_namespace};") ? 'package android.support.v7.appcompat;' : line }             outputs.uptodatewhen { false }         }         tasks.getbyname("compile${variant.name.capitalize()}unittestjava") dependson copytaskname     } } 

basically it's copying generated application r.java file tests build folder gets picked test compilation phase. tried putting copy generated sources folder, test compile phase doesn't seem pick there.


Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -