2016-05-30 24 views
6

Non ho toccato Mockito per un po 'e non l'ho mai usato estensivamente. Ma oggi, in qualche nuovo codice ho voluto usare le migliori pratiche così ho tirato fuori Mockito-core 2.0.54-beta con la seguente versione Java:L'oggetto Mockito non è un'istanza di dichiarazione della classe

java version "1.8.0" 
Java(TM) SE Runtime Environment (build 1.8.0-b132) 
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode) 

avevo bisogno di un'istanza di questa interfaccia per il test:

https://bitbucket.org/globalmentor/rincl/src/bf0e8875a1bae16247dd904e0b8bc067c9f8abc9/src/main/java/io/rincl/ResourceI18nConcern.java

public interface ResourceI18nConcern extends Concern { 

    public Locale getLocale(@Nonnull Locale.Category category); 

    public void setLocale(@Nonnull Locale.Category category, @Nonnull Locale locale); 

    public default void setLocale(@Nonnull Locale locale) {...} 

    public Resources getResources(@Nonnull final Class<?> contextClass) throws ResourceConfigurationException; 

} 

questa interfaccia estende questo (solo un'interfaccia marcatore vuoto):

https://bitbucket.org/globalmentor/csar/src/125b837e9936ddb8d6340fa99b6b5da872d1e6e5/src/main/java/io/csar/Concern.java

Nella mia prova ho provato a fare questa semplice cosa:

final ResourceI18nConcern defaultConcern=mock(ResourceI18nConcern.class); 

ottengo il seguente stack trace:

org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: interface io.rincl.ResourceI18nConcern 

Mockito can only mock visible & non-final classes. 
If you're not sure why you're getting this error, please report to the mailing list. 

Underlying exception : java.lang.IllegalArgumentException: object is not an instance of declaring class 
    at io.rincl.RinclTest.defaultConcernRinclGetLocaleIsConcernLocale(RinclTest.java:91) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$ForTypeArgument.resolve(TypeDescription.java:3875) 
    at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$Delegator$Chained.resolve(TypeDescription.java:3501) 
    at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$ForTypeArgument.resolve(TypeDescription.java:3834) 
    at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$Delegator.asList(TypeDescription.java:3477) 
    at net.bytebuddy.description.type.TypeDescription$Generic$OfWildcardType$ForLoadedType.getDeclaredAnnotations(TypeDescription.java:4771) 
    at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onWildcard(TypeDescription.java:676) 
    at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onWildcard(TypeDescription.java:659) 
    at net.bytebuddy.description.type.TypeDescription$Generic$OfWildcardType.accept(TypeDescription.java:4679) 
    at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onParameterizedType(TypeDescription.java:687) 
    at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onParameterizedType(TypeDescription.java:659) 
    at net.bytebuddy.description.type.TypeDescription$Generic$OfParameterizedType.accept(TypeDescription.java:5021) 
    at net.bytebuddy.description.type.TypeDescription$Generic$LazyProjection.accept(TypeDescription.java:5794) 
    at net.bytebuddy.description.method.ParameterDescription$TypeSubstituting.getType(ParameterDescription.java:866) 
    at net.bytebuddy.description.method.ParameterList$AbstractBase.asTypeList(ParameterList.java:85) 
    at net.bytebuddy.description.method.MethodDescription$AbstractBase.asTypeToken(MethodDescription.java:635) 
    at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Harmonized.of(MethodGraph.java:862) 
    at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Store.registerTopLevel(MethodGraph.java:1059) 
    at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.doAnalyze(MethodGraph.java:569) 
    at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.analyze(MethodGraph.java:529) 
    at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.doAnalyze(MethodGraph.java:565) 
    at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.compile(MethodGraph.java:502) 
    at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$AbstractBase.compile(MethodGraph.java:423) 
    at net.bytebuddy.dynamic.scaffold.MethodRegistry$Default.prepare(MethodRegistry.java:489) 
    at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:153) 
    at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:2564) 
    at org.mockito.internal.creation.bytebuddy.MockBytecodeGenerator.generateMockClass(MockBytecodeGenerator.java:60) 
    at org.mockito.internal.creation.bytebuddy.CachingMockBytecodeGenerator$CachedBytecodeGenerator.generate(CachingMockBytecodeGenerator.java:72) 
    at org.mockito.internal.creation.bytebuddy.CachingMockBytecodeGenerator$CachedBytecodeGenerator.getOrGenerateMockClass(CachingMockBytecodeGenerator.java:64) 
    at org.mockito.internal.creation.bytebuddy.CachingMockBytecodeGenerator.get(CachingMockBytecodeGenerator.java:27) 
    at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createProxyClass(ByteBuddyMockMaker.java:54) 
    at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:27) 
    at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:32) 
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:54) 
    at org.mockito.Mockito.mock(Mockito.java:1443) 
    at org.mockito.Mockito.mock(Mockito.java:1356) 
    ... 26 more 

sto facendo qualcosa di sbagliato? Questo mi sembrava come se fosse semplice.

Per riprodurre questo problema, clonare https://bitbucket.org/globalmentor/rincl.git e verificare commit 2f88d7c5e5ac17b6d316ed54c12cb7b447b7d6ac. Quindi provare a eseguire il test seguente:

import static org.junit.Assert.*; 
import static org.hamcrest.Matchers.*; 
import static org.mockito.Mockito.*; 
import java.util.Locale; 
import java.util.Locale.Category; 
import org.junit.*; 

public class RinclTest { 
    @Test 
    public void defaultConcernRinclGetLocaleIsConcernLocale() { 
     final ResourceI18nConcern defaultConcern=mock(ResourceI18nConcern.class); 
    } 
} 
+0

Informazioni insufficienti: versione Java, test effettivo, OSGI, ecc.? Non ho alcun problema a deridere il codice di cui sopra. Per me questo sembra essere un problema di caricamento di classe che potrebbe essere causato dalla configurazione dell'ambiente. – Brice

+0

Tuttavia, con una seconda occhiata allo stacktrace, questo potrebbe causare un problema di caricamento in classe causato dall'impostazione dell'ambiente Android. Questo potrebbe essere qualcosa che bytebuddy può gestire comunque. – Brice

+0

OK, @Brice, ho aggiunto un commit specifico per il checkout e un codice di test specifico. –

risposta

13

La versione del runtime Java è marzo 2014; un sacco di bug sono stati corretti nella VM da allora e si dovrebbe davvero aggiornare. Sono sicuro al 99% che questo problema sia legato alle annotazioni di tipo (@NonNull) che sono state introdotte in questa versione per la prima volta in questa esatta versione. Sono sicuro che il tuo problema andrà via se aggiorni la tua VM.

Posso eseguire correttamente il test proposto con una build recente della macchina virtuale HotSpot.