Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trouble configuration of mockito with eclipse. Gives error: java.lang.verifyError

When i add my mockito library to class path, and use a simple mockito example for testing where i try to return a wrong value for the function add by using the mock object, i get java.lang.verifyerror. Following is the code used for testing followed by logcat.

    @Test
    public void testadd()
    {
        maincode obj2=mock(maincode.class);
        when(obj2.add(0, 0)).thenReturn(9);
        assertEquals(obj2.add(0, 0),9); 
    }

I get the following error. Please help! thx.

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.(Enhancer.java:70) 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 testaddmock.testadd(testaddmock.java:24) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)

like image 918
user3054298 Avatar asked Dec 01 '13 12:12

user3054298


2 Answers

By default, Mockito uses cglib to create dynamic proxies, but for Android this will not work, because cglib generates .class files, not .dex. But starting from version 1.9.5 Mockito offers an extension point that allows replacing the proxy generation engine, so all you need is change this engine and I think Dexmaker is the best variant.

So to make it works you should just add dexmaker-mockito-1.0.jar to your project, and Mockito will use it to generate his proxies.

like image 189
Grimmy Avatar answered Oct 07 '22 01:10

Grimmy


@Grimmys answer (+1) has the correct answer for me.

When running on Android adding the missing gradle imports for Dexmaker is all thats required

androidTestCompile 'org.mockito:mockito-core:1.9.5' 
androidTestCompile 'com.google.dexmaker:dexmaker:1.1' 
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
like image 40
Dori Avatar answered Oct 07 '22 00:10

Dori