Export to GitHub

dexmaker - issue #16

Cant get dexmaker and mockito


Posted on Oct 15, 2012 by Swift Camel

What steps will reproduce the problem? 1. try to use dexmaker and mockito via maven 2. 3.

What is the expected output? What do you see instead? dexmaker will do its magic and cglib will not be used

What version of the product are you using? On what operating system? 0.9 (without the -mockito since it has a "strange" dependency to mockito core 1.9.8)

Please provide any additional information below. On intellij 11 and maven compiling agains android 4.1.x.x. Maven: <dependency> <groupId>com.google.dexmaker</groupId> <artifactId>dexmaker</artifactId> <version>0.9</version> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> </dependency>

Since the it will not work if I use the dexmaker-mockito. The dependency to mockito 1.9.8 core does not work. Shouldnt the dependency point to mockito 1.9.5 now? Then I guess I would only have to include that (dexmaker-moito with "correct" dependency) into my pom? Or Have I misunderstood the whole thing? Do I really need to go the lib path with jars + manual handling of maven artefacts etc..?

I have followed the guide on http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/ and it works. Now when all the updated releases are here and in the maven repos (http://search.maven.org/#artifactdetails%7Corg.mockito%7Cmockito-all%7C1.9.5%7Cjar) I was hoping that this should just work ...

The stacktrace: java.lang.ExceptionInInitializerError at org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:85) at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:62) at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:56) at org.mockito.internal.creation.CglibMockMaker.createMock(CglibMockMaker.java:23) at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26) at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51) at org.mockito.Mockito.mock(Mockito.java:1243) at org.mockito.Mockito.mock(Mockito.java:1120) at com.bacana.test.LoginActivityTest.testMockitoMock(LoginActivityTest.java:47) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) Caused by: java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167) at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105) at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)

Comment #1

Posted on Oct 19, 2012 by Massive Bear

Please try using mockito-1.9.5 and the new dexmaker-1.0 jar files.

Comment #2

Posted on Oct 24, 2012 by Massive Giraffe

Hi, I am also experiencing this issue. I have followed the set-up instructions against Jesse Wilson's post, http://corner.squareup.com/2012/10/mockito-android.html.

Notably, Jesse indicates that there are 3 jars required;

  1. dexmaker-1.0.jar
  2. dexmaker-mockito-1.0.jar
  3. mockito-all-1.9.5.jar

Does this go any distance to explaining the before mentioned stacktrace?

Comment #3

Posted on Oct 24, 2012 by Swift Camel

Hi again.

Since I build/manage my Android applications with maven and I don't want to resort to include jars or setup my own repository with "special jars", I'm really looking forward to when the Dexmaker 1.0 with dependency to Mockito 1.9.5 hits the public repositories.

Maven central haven't received them yet but I guess they will be up soon.

My wish is that if the maven artifact and the dependencies work then I should only have to include one dependency and then it should just work ;)

On a side note it does work via maven (as stated before) IF I setup a local repo and add the "special jars" - both via maven builds and in Intellij 11. I guess it would work with Eclipse to.

Oh, I think the stacktrace is simply because that setup won't work - dexmaker isn't "kicking in", since there are cglib references in the stacktrace.

Regards Niclas

Comment #4

Posted on Oct 24, 2012 by Massive Giraffe

Hi Niclas,

Thank you for your comment. I've posted something on SO (http://stackoverflow.com/questions/13048985/verifyerror-using-mockito-1-9-5-and-dexmaker-mockito-1-0) to share the problem and post a solution as and when one appears! If I had a penny for everytime I started TDD on Android and failed! :S

Regards, David

Comment #5

Posted on Oct 25, 2012 by Massive Giraffe

Answered my own question on SO if you were interested Niclas. Obviously I didn't understand that the emulator was not good enough for this android-mockito implementation. Still missing something but glad I have a mocking framework in Android!

Comment #6

Posted on Oct 25, 2012 by Swift Camel

Maybe I have misunderstood something but ... I have Dexmaker and Mockito working with the help of maven BUT via the "special jars" installed locally in my local maven repo from http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/, running on an android 2.3 emulator (!).

Since I'm using "old" versions of both dexmaker and mockito I have the following in my tests setup method: getInstrumentation().getTargetContext().getCacheDir(); (This statement should not be needed in the dexmaker 0.9+ release though ...) After that statement I have mock(SomeClass.class, RETURNS_DEEP_STUBS) and mock(SomeOtherClass.class) and they work in IntelliJ 11 and if I run them via maven.

But as I mentioned in the previous post, I really don't want to do all theses special things. I don't want to introduce any special environment setups. It should just work with one or two maven dependencies ;)

/niclas

Status: Fixed

Labels:
Type-Defect Priority-Medium