ClassNotFoundException even for String.class

1,266 views
Skip to first unread message

Macarse

unread,
Nov 12, 2010, 8:21:14 AM11/12/10
to Android Mock Discussion
Hi,

I am trying to run tests with mocks from Eclipse.
I continue getting:
[2010-11-12 10:13:22 - ioc_test] Test run failed:
java.lang.ClassNotFoundException

My test:

@UsesMocks(String.class)
public void testObject() {
String myMockObject = AndroidMock.createMock(String.class);
AndroidMock.expect(myMockObject.toString()).andReturn("");
AndroidMock.replay(myMockObject);
assertEquals("", myMockObject.toString());
AndroidMock.verify(myMockObject);
}

In the AnnotationProcessor.log I get:

Nov 12, 2010 10:18:35 AM - NOTE : Start Processing Annotations
Nov 12, 2010 10:18:35 AM - NOTE : Processing [public void
testObject() ]
Nov 12, 2010 10:18:35 AM - NOTE : Adding Class to Mocking List:
java.lang.String
Nov 12, 2010 10:18:35 AM - NOTE : Found 1 classes to mock
Nov 12, 2010 10:18:35 AM - NOTE : Mocking class java.lang.String
Nov 12, 2010 10:18:35 AM - ERROR : Could not find java.lang.String
Nov 12, 2010 10:18:35 AM - ERROR : java.lang.ClassNotFoundException:
v15.genmocks.java.lang.StringDelegateSubclass
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at
com.google.android.testing.mocking.AndroidFrameworkMockGenerator.getPrebuiltClassesFor(AndroidFrameworkMockGenerator.java:
80)
at
com.google.android.testing.mocking.AndroidFrameworkMockGenerator.getMocksForClass(AndroidFrameworkMockGenerator.java:
59)
at
com.google.android.testing.mocking.UsesMocksProcessor.getClassMocks(UsesMocksProcessor.java:
177)
at
com.google.android.testing.mocking.UsesMocksProcessor.getMocksFor(UsesMocksProcessor.java:
100)
at
com.google.android.testing.mocking.UsesMocksProcessor.process(UsesMocksProcessor.java:
75)
at
org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:
139)
at
org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:
121)
at
org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:
159)
at
org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:
134)
at
org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:
809)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:
428)
at
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:
364)
at
org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:
178)
at
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:
301)
at
org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:
60)
at
org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:
254)
at
org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:
173)
at org.eclipse.core.internal.events.BuildManager
$2.run(BuildManager.java:629)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
172)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
203)
at org.eclipse.core.internal.events.BuildManager
$1.run(BuildManager.java:255)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
258)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
220)
at
org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:
362)
at org.eclipse.core.internal.resources.Project$1.run(Project.java:
545)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:
1975)
at
org.eclipse.core.internal.resources.Project.internalBuild(Project.java:
524)
at org.eclipse.core.internal.resources.Project.build(Project.java:
115)
at org.eclipse.jdt.internal.ui.util.CoreUtility
$BuildJob.run(CoreUtility.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

Nov 12, 2010 10:18:35 AM - NOTE : Known Classpath:
Nov 12, 2010 10:18:35 AM - NOTE : file:/Users/macarse/Downloads/
AndroidMock-1.1.0/AndroidMockGenerator.jar
Nov 12, 2010 10:18:35 AM - NOTE : file:/Users/macarse/.m2/repository/
android/android/1.6_r2/android-1.6_r2.jar
Nov 12, 2010 10:18:35 AM - NOTE : file:/Users/macarse/Documents/
android_ioc/ioc_app/bin/
Nov 12, 2010 10:18:35 AM - NOTE : Found 0 mocked classes to save
Nov 12, 2010 10:18:35 AM - NOTE : Finished Processing Mocks


It happens the same when I try to mock classes of my own.
What can be wrong?

Thanks.

Stephen Woodward

unread,
Nov 13, 2010, 4:11:05 AM11/13/10
to androi...@googlegroups.com

Hi,

First off, I'm guessing that you're using String as an example or proof of concept. But as a final class, it's not mockable. That's why it's throwing up this exception here.

I made some major recent changes to how sdk classes are mocked and it seems to have caused this exception to be thrown before the check-and-warn code.

Second, from your error output I see that you haven't added the frameworks mock jar file to your annotation processor factory path. This is a new step that I haven't had the chance to add to the instructions yet. There is an email on the discussion group related to this with a title similar to "New Android Mock".

In summary, you need to do the same process as you did for ANDROID_JAR (or similar), the (Annotations -> Factory Path) variable you added during setup to point to the android ask jar file. Create another one with a name like ANDROID_FRAMEWORK_MOCKS and point that at the file "android_framework_mocks.jar" which is in the bin folder of your android mock install folder.

Third, if you're seeing a ClassNotFound on your own classes, it might be that you're mocking a class that references a class in a Referenced Library. Android Test projects cannot see the contents of any Android project referenced libraries. Even if you're not mocking a jar from inside such a jar, if the class being mocked has a method whose signature refers to such a class, you'll have trouble.

Check the stack trace to see which class is not found then add the jar containing that class to the build path of your test project.

NOTE: to be clear this is not the factory path of step 2. This is your normal test project's Referenced Libraries.

If those steps don't sort out the problems let me know. I'm not sure why you would see this same stack trace with your own classes except in the case I described in step 3. But if you're still having trouble let me know and send me the stack trace and I'll see what I can figure out.

Thanks,

Steve

On Nov 12, 2010 1:21 PM, "Macarse" <mac...@gmail.com> wrote:

Macarse

unread,
Nov 17, 2010, 10:58:19 AM11/17/10
to Android Mock Discussion

Steve:

Thanks for the feedback. I couldn't fix it in Eclipse but it work like
charm from maven.

I made a blog post about it:
http://android-argentina.blogspot.com/2010/11/tdd-skeleton-for-android.html

Greetings.

On Nov 13, 6:11 am, Stephen Woodward <sd.woodwar...@googlemail.com>
wrote:
>  On Nov 12, 2010 1:21 PM, "Macarse" <maca...@gmail.com> wrote:

Mike Liu

unread,
Nov 23, 2010, 4:12:44 AM11/23/10
to Android Mock Discussion
Steve,

I think I've also hit the same problem. I remember your comment about
missing jars in the test project, but I've got the jar in the build
path and i'm still seeing this exception in the mock generator logs
(Gson is in the constructor of one of the mocked classes; I believe
Gson is a final class). Any way around this?

stack trace:

Nov 23, 2010 5:02:59 PM - ERROR : java.lang.NoClassDefFoundError: com/
google/gson/Gson
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getDeclaredConstructors(Unknown Source)
at
com.google.android.testing.mocking.AndroidMockGenerator.containsUsableConstructor(AndroidMockGenerator.java:
134)
at
com.google.android.testing.mocking.AndroidMockGenerator.classIsSupportedType(AndroidMockGenerator.java:
145)
at
com.google.android.testing.mocking.AndroidMockGenerator.createMocksForClass(AndroidMockGenerator.java:
93)
at
com.google.android.testing.mocking.AndroidMockGenerator.createMocksForClass(AndroidMockGenerator.java:
88)
at
com.google.android.testing.mocking.UsesMocksProcessor.getClassMocks(UsesMocksProcessor.java:
175)
184)
at org.eclipse.core.internal.events.BuildManager
$2.run(BuildManager.java:627)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
170)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
201)
at org.eclipse.core.internal.events.BuildManager
$1.run(BuildManager.java:253)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
256)
at
org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:
309)
at
org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:
341)
at
org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:
140)
at
org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:
238)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 34 more

Thanks,

Mike

Stephen Woodward

unread,
Nov 23, 2010, 4:30:32 AM11/23/10
to androi...@googlegroups.com

Do you know which jar contains com.google.gain.Gson? I suspect it isn't android.jar. It sounds like a Google Api. You'll want to make sure it's in the factory classpath for the test project in the same way as you have android.jar (ANDROID_RUNTIME).

On Nov 23, 2010 9:12 AM, "Mike Liu" <mml...@gmail.com> wrote:

Mike Liu

unread,
Nov 23, 2010, 4:58:24 AM11/23/10
to Android Mock Discussion
Ahh.. the factory classpath fixed it.

Thanks,
Mike

On Nov 23, 5:30 pm, Stephen Woodward <sd.woodwar...@googlemail.com>
wrote:
>  On Nov 23, 2010 9:12 AM, "Mike Liu" <mml6...@gmail.com> wrote:

Bo

unread,
Nov 29, 2010, 8:34:25 AM11/29/10
to Android Mock Discussion
Hi all,

I'm pretty new to this and have a problem looking pretty much like
Mike Liu's, see build log below.
Am I missing android/text/Editable stuff or?

"Second, from your error output I see that you haven't added the
frameworks
mock jar file to your annotation processor factory path. This is a new
step
that I haven't had the chance to add to the instructions yet. There is
an
email on the discussion group related to this with a title similar to
"New
Android Mock". "

I can't find info about this. Can anyone point my in the right
direction for "setting factory classpath"?
I'm compiling from command line and all I've done is to add
AndroidMockGenerator.jar to the classpath for javac.

BR's
//Bo

[javac] Note: Start Processing Annotations
[javac] Note: Processing [testMyTest()]
[javac] Note: Adding Class to Mocking List: MyClassToMock
[javac] Note: Found 1 classes to mock
[javac] Note: Mocking class MyClassToMock
[javac] error: Could not find MyClassToMock
[javac] error: java.lang.NoClassDefFoundError: android/text/
Editable
[javac] at java.lang.Class.getDeclaredConstructors0(Native
Method)
[javac] at
java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
[javac] at java.lang.Class.getDeclaredConstructors(Class.java:
1836)
[javac] at
com.google.android.testing.mocking.AndroidMockGenerator.containsUsableConstructor(AndroidMockGenerator.java:
134)
[javac] at
com.google.android.testing.mocking.AndroidMockGenerator.classIsSupportedType(AndroidMockGenerator.java:
145)
[javac] at
com.google.android.testing.mocking.AndroidMockGenerator.createMocksForClass(AndroidMockGenerator.java:
93)
[javac] at
com.google.android.testing.mocking.AndroidMockGenerator.createMocksForClass(AndroidMockGenerator.java:
88)
[javac] at
com.google.android.testing.mocking.UsesMocksProcessor.getClassMocks(UsesMocksProcessor.java:
175)
[javac] at
com.google.android.testing.mocking.UsesMocksProcessor.getMocksFor(UsesMocksProcessor.java:
100)
[javac] at
com.google.android.testing.mocking.UsesMocksProcessor.process(UsesMocksProcessor.java:
75)
[javac] at
com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:
625)
[javac] at
com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:
554)
[javac] at
com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:
699)
...
...
...

Stephen Woodward

unread,
Nov 29, 2010, 3:50:35 PM11/29/10
to androi...@googlegroups.com
This sounds a lot like the "android.jar" missing from your Annotations Factory Classpath.

Take a look for ANDROID_RUNTIME in the setup PDF file (http://android-mock.googlecode.com/files/AndroidMockInEclipse-1.0.1.pdf)  (pages 4-7)

As a quick summary, you want to Open up the project properties, turn on Annotation processing, then drill down the menus to get to Factory Path.  From there, add a reference to the android.jar file as ANDROID_RUNTIME as a new classpath variable.  The PDF linked above has more detailed steps.

Let me know if you still have troubles.  Believe it or not, closing and reopening Eclipse can fix such problems too, assuming your setup is correct.

Mike Liu

unread,
Nov 29, 2010, 11:22:00 PM11/29/10
to Android Mock Discussion

Bo

unread,
Nov 30, 2010, 3:04:40 AM11/30/10
to Android Mock Discussion
Thanks for the information!

I need to get it to work from command line because of our build
system.
Is it possible to set the Annotations factory classpath when compiling
with javac? Or is this where I need to use apt?

BR's
//Bo

Stephen Woodward

unread,
Nov 30, 2010, 3:09:39 AM11/30/10
to androi...@googlegroups.com

Command line is no problem. Add android.jar to your classpath. Same for the mock generator jar.

Agilen

unread,
Jan 14, 2011, 6:09:21 PM1/14/11
to Android Mock Discussion
Hi Stephen,

Thanks a lot man :)

I was not able to create the Mock for my own class. I just close and
open the Eclipse and Emulator. It resolved the problem.

Thanks,
Agilen

Shea Levy

unread,
Jan 18, 2011, 12:08:48 PM1/18/11
to Android Mock Discussion
Hi Stephen,

I'm getting the same error, even after adding the
android_framework_mocks.jar to the factory classpath.

Stack trace:

java.lang.RuntimeException: Could not find mock for java.lang.Object
-- Make sure to run the MockGenerator.jar on your test jar, and to
build the Android test APK using the modified jar created by
MockGenerator
at
com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:
2790)
at
com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java:
187)
at
com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java:
157)
at com.shealevy.android.calendarlibtestapp.test.CalendarFixture
$CalendarMockContext.<init>(CalendarFixture.java:42)
at
com.shealevy.android.calendarlibtestapp.test.CalendarFixture.getMockContext(CalendarFixture.java:
27)
at
com.shealevy.android.calendarlibtestapp.test.CalendarTest.testItSavesAnEntryWithJustACalendarNameAndAnAssociatedAccount(CalendarTest.java:
59)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:164)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:151)
at
android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:
418)
at android.app.Instrumentation
$InstrumentationThread.run(Instrumentation.java:1520)
Caused by: java.lang.ClassNotFoundException:
v15.genmocks.java.lang.ObjectDelegateInterface
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:237)
at java.lang.Class.forName(Class.java:183)
at
com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:
2788)
... 17 more
Caused by: java.lang.NoClassDefFoundError:
v15.genmocks.java.lang.ObjectDelegateInterface
... 21 more
Caused by: java.lang.ClassNotFoundException:
v15.genmocks.java.lang.ObjectDelegateInterface in loader
dalvik.system.PathClassLoader@43562798
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
... 21 more

Log:
Jan 18, 2011 12:05:02 PM - NOTE : Start Processing Annotations
Jan 18, 2011 12:05:02 PM - NOTE : Processing [public void
<init>(android.content.Context, HashMap<Class<?
>,HashMap<java.lang.reflect.Method,HashMap<java.lang.String,java.lang.Object>>>)
throws java.lang.IllegalArgumentException,
java.lang.SecurityException, java.lang.IllegalAccessException,
java.lang.NoSuchFieldException, java.lang.ClassNotFoundException,
java.lang.reflect.InvocationTargetException]
Jan 18, 2011 12:05:02 PM - NOTE : Adding Class to Mocking List:
java.lang.Object
Jan 18, 2011 12:05:02 PM - NOTE : Found 1 classes to mock
Jan 18, 2011 12:05:02 PM - NOTE : Mocking class java.lang.Object
Jan 18, 2011 12:05:02 PM - ERROR : Could not find java.lang.Object
Jan 18, 2011 12:05:02 PM - ERROR : java.lang.ClassNotFoundException:
v15.genmocks.java.lang.ObjectDelegateSubclass
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at
com.google.android.testing.mocking.AndroidFrameworkMockGenerator.getPrebuiltClassesFor(AndroidFrameworkMockGenerator.java:
80)
at
com.google.android.testing.mocking.AndroidFrameworkMockGenerator.getMocksForClass(AndroidFrameworkMockGenerator.java:
59)
at
com.google.android.testing.mocking.UsesMocksProcessor.getClassMocks(UsesMocksProcessor.java:
177)
org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.compile(IncrementalImageBuilder.java:
321)
at
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:
301)
at
org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.build(IncrementalImageBuilder.java:
134)
at
org.eclipse.jdt.internal.core.builder.JavaBuilder.buildDeltas(JavaBuilder.java:
265)
at
org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:
193)
at org.eclipse.core.internal.events.BuildManager
$2.run(BuildManager.java:629)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
172)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
203)
at org.eclipse.core.internal.events.BuildManager
$1.run(BuildManager.java:255)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:
258)
at
org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:
311)
at
org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:
343)
at
org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:
144)
at
org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:
242)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

Jan 18, 2011 12:05:02 PM - NOTE : Known Classpath:
Jan 18, 2011 12:05:02 PM - NOTE : file:/usr/lib/classpath/
AndroidMockGenerator.jar
Jan 18, 2011 12:05:02 PM - NOTE : file:/home/shea/android-sdk/
platforms/android-3/android.jar
Jan 18, 2011 12:05:02 PM - NOTE : file:/home/shea/dev/android/
CalendarLib/CalendarLibTestApp/bin/
Jan 18, 2011 12:05:02 PM - NOTE : file:/usr/lib/classpath/
android_framework_mocks.jar
Jan 18, 2011 12:05:02 PM - NOTE : Found 0 mocked classes to save
Jan 18, 2011 12:05:02 PM - NOTE : Finished Processing Mocks

On Nov 30 2010, 3:09 am, Stephen Woodward
<sd.woodwar...@googlemail.com> wrote:
> Command line is no problem. Add android.jar to your classpath. Same for the
> mock generator jar.

Stephen Woodward

unread,
Jan 19, 2011, 2:29:05 AM1/19/11
to androi...@googlegroups.com

That's very odd. A couple of questions.

1. are you really trying to mock java.lang.Object? You should be able to but there's no reason to do so except to test Android mock.

2. It found the framework mocks jar (see 12:05:02 pm logs). Does the jar contain a class called v15.genmocks.java.lang.ObjectDelegateInterface?

Shea Levy

unread,
Jan 19, 2011, 6:22:00 AM1/19/11
to androi...@googlegroups.com
On 01/19/2011 02:29 AM, Stephen Woodward wrote:

That's very odd. A couple of questions.

1. are you really trying to mock java.lang.Object? You should be able to but there's no reason to do so except to test Android mock.

No, android.content.ContentResolver is what I really want to mock... But same issue occurs.

2. It found the framework mocks jar (see 12:05:02 pm logs). Does the jar contain a class called v15.genmocks.java.lang.ObjectDelegateInterface?

I tried checking the jar and it turns out it wasn't world-readable *facepalm*. I fixed that and mocking Object works now, but ContentResolver does not.

Stack Trace:
java.lang.RuntimeException: Could not find mock for android.content.ContentResolver  -- Make sure to run the MockGenerator.jar on your test jar, and to build the Android test APK using the modified jar created by MockGenerator

at com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:2790)
at com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java:187)
at com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java:157)
at com.shealevy.android.calendarlibtestapp.test.CalendarFixture$CalendarMockContext.<init>(CalendarFixture.java:42)
at com.shealevy.android.calendarlibtestapp.test.CalendarFixture.getMockContext(CalendarFixture.java:27)
at com.shealevy.android.calendarlibtestapp.test.CalendarTest.testItSavesAnEntryWithJustACalendarNameAndAnAssociatedAccount(CalendarTest.java:56)

at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:164)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:151)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:418)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1520)
Caused by: java.lang.ClassNotFoundException: v15.genmocks.android.content.ContentResolverDelegateInterface

at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:237)
at java.lang.Class.forName(Class.java:183)
at com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:2788)
... 17 more
Caused by: java.lang.NoClassDefFoundError: v15.genmocks.android.content.ContentResolverDelegateInterface
... 21 more
Caused by: java.lang.ClassNotFoundException: v15.genmocks.android.content.ContentResolverDelegateInterface in loader dalvik.system.PathClassLoader@435625e8

at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
... 21 more



Log File:

Jan 18, 2011 12:41:13 PM - NOTE : Start Processing Annotations
Jan 18, 2011 12:41:13 PM - NOTE : Processing [public void <init>(android.content.Context, HashMap<Class<?>,HashMap<java.lang.reflect.Method,HashMap<java.lang.String,java.lang.Object>>>) throws java.lang.IllegalArgumentException, java.lang.SecurityException, java.lang.IllegalAccessException, java.lang.NoSuchFieldException, java.lang.ClassNotFoundException, java.lang.reflect.InvocationTargetException]
Jan 18, 2011 12:41:13 PM - NOTE : Adding Class to Mocking List: android.content.ContentResolver
Jan 18, 2011 12:41:13 PM - NOTE : Found 1 classes to mock
Jan 18, 2011 12:41:13 PM - NOTE : Mocking class android.content.ContentResolver
Jan 18, 2011 12:41:13 PM - ERROR : Could not find android.content.ContentResolver
Jan 18, 2011 12:41:13 PM - ERROR : java.lang.ClassNotFoundException: v15.genmocks.android.content.ContentResolverDelegateSubclass

    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at com.google.android.testing.mocking.AndroidFrameworkMockGenerator.getPrebuiltClassesFor(AndroidFrameworkMockGenerator.java:80)
    at com.google.android.testing.mocking.AndroidFrameworkMockGenerator.getMocksForClass(AndroidFrameworkMockGenerator.java:59)
    at com.google.android.testing.mocking.UsesMocksProcessor.getClassMocks(UsesMocksProcessor.java:177)
    at com.google.android.testing.mocking.UsesMocksProcessor.getMocksFor(UsesMocksProcessor.java:100)
    at com.google.android.testing.mocking.UsesMocksProcessor.process(UsesMocksProcessor.java:75)
    at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:139)
    at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:121)
    at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:159)
    at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:134)
    at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:809)
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:428)
    at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:364)
    at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.compile(IncrementalImageBuilder.java:321)
    at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:301)
    at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.build(IncrementalImageBuilder.java:134)
    at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildDeltas(JavaBuilder.java:265)
    at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:193)
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:629)

    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:172)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:203)
    at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:255)

    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:258)
    at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:311)
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:343)
    at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:144)
    at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:242)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

Jan 18, 2011 12:41:13 PM - NOTE : Known Classpath:
Jan 18, 2011 12:41:13 PM - NOTE : file:/home/shea/android-sdk/platforms/android-3/android.jar
Jan 18, 2011 12:41:13 PM - NOTE : file:/home/shea/dev/android/CalendarLib/CalendarLibTestApp/bin/
Jan 18, 2011 12:41:13 PM - NOTE : file:/usr/lib/classpath/android_framework_mocks.jar
Jan 18, 2011 12:41:13 PM - NOTE : file:/usr/lib/classpath/AndroidMockGenerator.jar
Jan 18, 2011 12:41:13 PM - NOTE : Found 0 mocked classes to save
Jan 18, 2011 12:41:13 PM - NOTE : Finished Processing Mocks
Jan 19, 2011 6:04:05 AM - NOTE : Start Processing Annotations
Jan 19, 2011 6:04:05 AM - NOTE : Processing [public void <init>() ]
Jan 19, 2011 6:04:05 AM - NOTE : Adding Class to Mocking List: java.lang.Object
Jan 19, 2011 6:04:05 AM - NOTE : Found 1 classes to mock
Jan 19, 2011 6:04:05 AM - NOTE : Mocking class java.lang.Object
Jan 19, 2011 6:04:05 AM - NOTE : Found 10 mocked classes to save
Jan 19, 2011 6:04:05 AM - NOTE : Saving v16.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v16.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving v201.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v201.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving v21.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v21.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving v15.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v15.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving v22.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v22.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving v22.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v22.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving v15.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v15.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving v21.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v21.genmocks.java.lang.ObjectDelegateSubclass
Jan 19, 2011 6:04:05 AM - NOTE : Saving v201.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v201.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving v16.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Saving via Eclipse v16.genmocks.java.lang.ObjectDelegateInterface
Jan 19, 2011 6:04:05 AM - NOTE : Finished Processing Mocks

(As an aside: How do I remove Object from the list of classes to mock? I don't have any @UsesMocks(Object.class) annotations anywhere anymore)

The jar contains v15.genmocks.android.content.ContentResolverDelegateSubclass, as well as v15.genmocks.android.content.ContentResolverDelegateInterface

Shea Levy

unread,
Jan 19, 2011, 6:27:20 AM1/19/11
to androi...@googlegroups.com
Ok, I don't get the error when I mock out MockContentResolver. Can android-mock handle abstract classes?

Stephen Woodward

unread,
Jan 19, 2011, 7:13:48 AM1/19/11
to androi...@googlegroups.com

If you can subclass it you can mock it.

Try quitting and restarting eclipse to drop the Object mocking. It caches a lot of stale info.

The error is very strange especially at Processing time. I'll need to think about it a while. But note that static and final methods can't be mocked so you might not get much benefit from mocking Content Resolver anyhow... the ask provided stub (called mock) should be a good workaround.

>> wrote:
>> >> Command line is no problem. Add android.jar to your classpath. Same
>> for the
>> >> mock generator jar.
>> >> On Nov 30, 2010 8:04 AM, "Bo" <bothe...@gmail.com

Jimmy Bosse

unread,
Feb 24, 2011, 6:23:25 PM2/24/11
to Android Mock Discussion
I am having a similar problem:

java.lang.RuntimeException: Could not find mock for
android.app.Activity -- Make sure to run the MockGenerator.jar on
your test jar, and to build the Android test APK using the modified
jar created by MockGenerator
at
com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:
2790)
at
com.google.android.testing.mocking.AndroidMock.createNiceMock(AndroidMock.java:
238)
at
com.google.android.testing.mocking.AndroidMock.createNiceMock(AndroidMock.java:
210)
at
thycotic.secretserver.java.android.task.tests.AccountSelectionTaskTests.testShouldLaunchEulaActivityWhenLaunchSignUpRequested(AccountSelectionTaskTests.java:
19)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at
android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:
430)
at android.app.Instrumentation
$InstrumentationThread.run(Instrumentation.java:1447)
Caused by: java.lang.ClassNotFoundException:
v21.genmocks.android.app.ActivityDelegateInterface
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:237)
at java.lang.Class.forName(Class.java:183)
at
com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:
2788)
... 15 more
Caused by: java.lang.NoClassDefFoundError:
v21.genmocks.android.app.ActivityDelegateInterface
... 19 more
Caused by: java.lang.ClassNotFoundException:
v21.genmocks.android.app.ActivityDelegateInterface in loader
dalvik.system.PathClassLoader@44e8d078
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
... 19 more

I have added the path for the framework jar and restarted eclipse and
emulators to no avail. Interestingly I do not see that the log file or
bin/genmocks is being generated either.

Stephen Woodward

unread,
Feb 26, 2011, 12:11:24 PM2/26/11
to androi...@googlegroups.com
Hi Jimmy,

It sounds like a setup problem, especially with no annotation log and no bin/genmocks created.  I'd make sure that you have the eclipse project set correctly to use annotation processors (the early eclipse setup steps in the eclipse android mock setup doc).  It may be something like a missing checkbox.

And just for sanity's sake, you do have an @UsesMocks{ Activity.class } on your test method or class, right?  (I'm guessing yes, but just in case).



Another thing you can do is to try it from the command line.

Try compiling your android code with AndroidMockGenerator.jar and android_framework_mocks.jar in the classpath.  I'm thinking something like:

javac -cp bin/android_framework_mocks.jar:bin/AndroidMockGenerator.jar:lib/android/android_v21.jar <your android java files>        (replace : with ; and / with \ for Windows)

See if this compiles correctly, and you should see on your screen the same output that the Annotation Processor log file would give you.  If it doesn't generate the classes correctly, you could copy and paste that into an email to me for further analysis.

Thanks,

Steve

daniela

unread,
Jul 11, 2011, 10:26:34 AM7/11/11
to androi...@googlegroups.com
Hi Steve,

I am trying to mock a TextView, and I get the following error:


java.lang.RuntimeException: Could not find mock for android.widget.TextView  -- Make sure to run the MockGenerator.jar on your test jar, and to build the Android test APK using the modified jar created by MockGenerator
at com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:2790)
at com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java:187)
at com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java:157)
at com.ncr.mobile.android.NCRActivityTest.testGivenSetOnClickListenerAssertOnClick(NCRActivityTest.java:39)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)
Caused by: java.lang.ClassNotFoundException: genmocks.android.widget.TextViewDelegateInterface
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:234)
at java.lang.Class.forName(Class.java:181)
at com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock.java:2788)
... 17 more
Caused by: java.lang.NoClassDefFoundError: genmocks.android.widget.TextViewDelegateInterface
... 21 more
Caused by: java.lang.ClassNotFoundException: genmocks.android.widget.TextViewDelegateInterface in loader dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.ncr.mobile-1.apk:/data/app/com.ncr.mobile-1.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
... 21 more

I have also attached the log file. 

I have the android-framework-mocks.jar on the factory path, and also the path to the android.jar there as well. 
Strangely, I am able to mock an OnClickListener (android.view.View.OnClickListener) -- I am able to get a non-null reference from 
AndroidMock.createNiceMock(View.OnClickListener.class).

Could you please give me any pointers as to what might be wrong?

Thank you very much for your help!
Daniela
AnnotationProcessor.log

Robert Tsai (蔡力元)

unread,
Jul 11, 2011, 1:04:17 PM7/11/11
to androi...@googlegroups.com
What is your app's target API level? Based on the output "genmocks.android.widget.TextViewDelegateInterface", it looks like you are using an API level (10 or higher) that is not supported by your version of AndroidMock.

The latest and greatest AndroidMock (from code.google.com) added support for API level 10-12 (gingerbread and honeycomb).

--Rob

daniela

unread,
Jul 12, 2011, 9:29:17 AM7/12/11
to Android Mock Discussion
Hi Rob,

Thanks for your reply! I'm using Android 2.1.

-Daniela

On Jul 11, 6:04 pm, Robert Tsai (蔡力元) <robt...@google.com> wrote:
> What is your app's target API level? Based on the output
> "genmocks.android.widget.TextViewDelegateInterface",
> it looks like you are using an API level (10 or higher) that is not
> supported by your version of AndroidMock.
>
> The latest and greatest AndroidMock (from code.google.com) added support for
> API level 10-12 (gingerbread and honeycomb).
>
> --Rob
>
>
>
>
>
>
>
> On Mon, Jul 11, 2011 at 7:26 AM, daniela <daniela.anton...@gmail.com> wrote:
> > Hi Steve,
>
> > I am trying to mock a TextView, and I get the following error:
>
> > java.lang.RuntimeException: Could not find mock for android.widget.TextView
> >  -- Make sure to run the MockGenerator.jar on your test jar, and to build
> > the Android test APK using the modified jar created by MockGenerator
> > at
> > com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock. java:2790)
> > at
> > com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java: 187)
> > at
> > com.google.android.testing.mocking.AndroidMock.createMock(AndroidMock.java: 157)
> > at
> > com.ncr.mobile.android.NCRActivityTest.testGivenSetOnClickListenerAssertOnC lick(NCRActivityTest.java:39)
> > at java.lang.reflect.Method.invokeNative(Native Method)
> > at
> > android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java :204)
> > at
> > android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:1 94)
> > at
> > android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentati onTestCase2.java:186)
> > at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
> > at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
> > at
> > android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.ja va:529)
> > at
> > android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java: 1448)
> > Caused by: java.lang.ClassNotFoundException:
> > genmocks.android.widget.TextViewDelegateInterface
> > at java.lang.Class.classForName(Native Method)
> > at java.lang.Class.forName(Class.java:234)
> > at java.lang.Class.forName(Class.java:181)
> > at
> > com.google.android.testing.mocking.AndroidMock.getInterfaceFor(AndroidMock. java:2788)
> > ... 17 more
> > Caused by: java.lang.NoClassDefFoundError:
> > genmocks.android.widget.TextViewDelegateInterface
> > ... 21 more
> > Caused by: java.lang.ClassNotFoundException:
> > genmocks.android.widget.TextViewDelegateInterface in loader
> > dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/da ta/app/com.ncr.mobile-1.apk:/data/app/com.ncr.mobile-1.apk]

Andrey Przhigotsky

unread,
Mar 26, 2012, 3:56:28 AM3/26/12
to androi...@googlegroups.com
Hmm, I have same problem. Setup my eclipse test project like described in AndroidMockinEclipse.pdf. But in ActivityInstrumentationTestCase2->testPreConditions() when I try use AndroidMock.class, I get "java.lang.NoClassDefFoundError: com.google.android.testing.mocking.AndroidMock". 
Reply all
Reply to author
Forward
0 new messages