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
Post a Comment