unit testing - Mockito's spy does not work along with AspectJ using maven -


i have following test class , i'm using mockito's spy. running unit test using eclipse (right click->run unit test) tests pass means eclipse build process using m2e , ajdt works fine.

@runwith(mockitojunitrunner.class) public class sampletest {  @mock private anotherclazz mockedclazz;  @spy @injectmocks private sampleimpl sampleservice = new sampleimpl() {      @override     public void somemethod() {        ...     } };   @test public void sometest() throws exception {     sampleservice.methodundertest(); } 

however when use maven run tests following exception.

tests run: 1, failures: 0, errors: 1, skipped: 0, time elapsed: 0.183 sec <<<     failure!     org.sample.sampletest  time elapsed: 0.182 sec  <<< error!     org.mockito.exceptions.base.mockitoexception: problems initiating spied field     sampleservice     @     org.mockito.internal.runners.junit45andhigherrunnerimpl$1.withbefores(junit45andhigherrunnerimpl.java:27)     @ org.junit.runners.blockjunit4classrunner.methodblock(blockjunit4classrunner.java:254)     @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:70)     @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:50)     @ org.junit.runners.parentrunner$3.run(parentrunner.java:238)     @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:63)     @ org.junit.runners.parentrunner.runchildren(parentrunner.java:236)     @ org.junit.runners.parentrunner.access$000(parentrunner.java:53)     @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:229)     @ org.junit.internal.runners.statements.runbefores.evaluate(runbefores.java:26)     @ org.junit.runners.parentrunner.run(parentrunner.java:309)     @ org.mockito.internal.runners.junit45andhigherrunnerimpl.run(junit45andhigherrunnerimpl.java:37)     @ org.mockito.runners.mockitojunitrunner.run(mockitojunitrunner.java:62)     @ org.apache.maven.surefire.junit4.junit4provider.execute(junit4provider.java:252)     @ org.apache.maven.surefire.junit4.junit4provider.executetestset(junit4provider.java:141)     @ org.apache.maven.surefire.junit4.junit4provider.invoke(junit4provider.java:112)     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:606)     @ org.apache.maven.surefire.util.reflectionutils.invokemethodwitharray(reflectionutils.java:189)     @ org.apache.maven.surefire.booter.providerfactory$providerproxy.invoke(providerfactory.java:165)     @ org.apache.maven.surefire.booter.providerfactory.invokeprovider(providerfactory.java:85)     @ org.apache.maven.surefire.booter.forkedbooter.runsuitesinprocess(forkedbooter.java:115)     @ org.apache.maven.surefire.booter.forkedbooter.main(forkedbooter.java:75) caused by: org.mockito.exceptions.base.mockitoexception:  mockito cannot mock class: class org.sample.sampleltest$1 mockito can mock visible & non-final classes. if you're not sure why you're getting error, please report mailing list.     ... 25 more caused by: org.mockito.cglib.core.codegenerationexception: java.lang.reflect.invocationtargetexception-->null     @ org.mockito.cglib.core.abstractclassgenerator.create(abstractclassgenerator.java:238)     @ org.mockito.cglib.proxy.enhancer.createhelper(enhancer.java:378)     @ org.mockito.cglib.proxy.enhancer.createclass(enhancer.java:318)     @ org.mockito.internal.creation.cglib.classimposterizer.createproxyclass(classimposterizer.java:123)     @ org.mockito.internal.creation.cglib.classimposterizer.imposterise(classimposterizer.java:57)     @ org.mockito.internal.creation.cglib.classimposterizer.imposterise(classimposterizer.java:49)     @ org.mockito.internal.creation.cglib.cglibmockmaker.createmock(cglibmockmaker.java:24)     @ org.mockito.internal.util.mockutil.createmock(mockutil.java:33)     @ org.mockito.internal.mockitocore.mock(mockitocore.java:59)     @ org.mockito.mockito.mock(mockito.java:1285)     @ org.mockito.internal.configuration.injection.spyoninjectedfieldshandler.processinjection(spyoninjectedfieldshandler.java:43)     @ org.mockito.internal.configuration.injection.mockinjectionstrategy.process(mockinjectionstrategy.java:68)     @ org.mockito.internal.configuration.injection.mockinjectionstrategy.relayprocesstonextstrategy(mockinjectionstrategy.java:89)     @ org.mockito.internal.configuration.injection.mockinjectionstrategy.process(mockinjectionstrategy.java:71)     @ org.mockito.internal.configuration.injection.mockinjection$ongoingmockinjection.apply(mockinjection.java:93)     @ org.mockito.internal.configuration.defaultinjectionengine.injectmocksonfields(defaultinjectionengine.java:20)     @ org.mockito.internal.configuration.injectingannotationengine.injectmocks(injectingannotationengine.java:100)     @ org.mockito.internal.configuration.injectingannotationengine.processinjectmocks(injectingannotationengine.java:62)     @ org.mockito.internal.configuration.injectingannotationengine.process(injectingannotationengine.java:56)     @ org.mockito.mockitoannotations.initmocks(mockitoannotations.java:108)     ... 25 more caused by: java.lang.reflect.invocationtargetexception     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:606)     @ org.mockito.cglib.core.reflectutils.defineclass(reflectutils.java:385)     @ org.mockito.cglib.core.abstractclassgenerator.create(abstractclassgenerator.java:220)     ... 44 more caused by: java.lang.verifyerror: cannot inherit final class     @ java.lang.classloader.defineclass1(native method)     @ java.lang.classloader.defineclass(classloader.java:800)     ... 50 more 

what here difference between ajc compiler used in eclipse ajdt , aspectj maven plugin configuration? configuration or phase missing here?

here pom.xml:

<dependency>         <groupid>org.aspectj</groupid>         <artifactid>aspectjrt</artifactid>         <version>1.6.11</version> </dependency> <build>     <plugins>         <plugin>             <groupid>org.codehaus.mojo</groupid>             <artifactid>aspectj-maven-plugin</artifactid>             <version>1.4</version>             <configuration>                 <source>1.6</source>                 <target>1.6</target>             </configuration>             <executions>                 <execution>                     <phase>process-sources</phase>                     <goals>                         <goal>compile</goal>                         <goal>test-compile</goal>                     </goals>                 </execution>             </executions>         </plugin>     </plugins> </build> 

update: haven't found solution yet know why happening. problem lies here on overriding somemethod(). removing method override or commenting out aspectj maven plugin solves problem workaround. cannot let aspectj out of project have mock somemethod() without overriding (e.g. using mockito itself). looks bug me i'm not quite sure come aspectj or mockito.

what here difference between ajc compiler used in eclipse ajdt , aspectj maven plugin configuration?

well, use old aspectj compiler , runtime 2011 in maven, ajdt uses more recent version. btw, code have compliant java 6? anyway, should not problem, recommend use current aspectj maven plugin 1.7 , latest aspectj version. can still compile 1.6-compatible code it. when tried recreate situation old aspectj version, code not compile, have not provided real sscce, have no idea jdk version, mockito version, junit version etc.

try maven configuration in pom:

<properties>     <project.build.sourceencoding>utf-8</project.build.sourceencoding>     <java.version>1.6</java.version>     <aspectj.version>1.8.6</aspectj.version> </properties>  <build>     <plugins>         <plugin>             <artifactid>maven-compiler-plugin</artifactid>             <version>3.3</version>             <configuration>                 <source>${java.version}</source>                 <target>${java.version}</target>                 <!-- important -->                 <useincrementalcompilation>false</useincrementalcompilation>             </configuration>         </plugin>         <plugin>             <groupid>org.codehaus.mojo</groupid>             <artifactid>aspectj-maven-plugin</artifactid>             <version>1.7</version>             <configuration>                 <showweaveinfo>true</showweaveinfo>                 <source>${java.version}</source>                 <target>${java.version}</target>                 <xlint>ignore</xlint>                 <compliancelevel>${java.version}</compliancelevel>                 <encoding>utf-8</encoding>                 <verbose>true</verbose>             </configuration>             <executions>                 <execution>                     <!-- important -->                     <phase>process-sources</phase>                     <goals>                         <goal>compile</goal>                         <goal>test-compile</goal>                     </goals>                 </execution>             </executions>             <dependencies>                 <dependency>                     <groupid>org.aspectj</groupid>                     <artifactid>aspectjtools</artifactid>                     <version>${aspectj.version}</version>                 </dependency>             </dependencies>         </plugin>     </plugins> </build>  <dependencies>     <dependency>         <groupid>org.aspectj</groupid>         <artifactid>aspectjrt</artifactid>         <version>${aspectj.version}</version>         <scope>runtime</scope>     </dependency>     <dependency>         <groupid>junit</groupid>         <artifactid>junit</artifactid>         <version>4.11</version>         <scope>test</scope>     </dependency>     <dependency>         <groupid>org.mockito</groupid>         <artifactid>mockito-core</artifactid>         <version>1.9.5</version>         <scope>test</scope>     </dependency> </dependencies> 

this works me. btw, please note <compliancelevel> in addition <source> , <target>.


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -