2016-05-30 3 views
6

Ich habe Mockito für eine Weile nicht berührt, und ich habe es nie ausgiebig verwendet. Aber heute in einigen neuen Code wollte ich am besten Praktiken verwenden, so zog ich Mockito-Kern 2.0.54-beta mit dem folgenden Java-Version:Mockito-Objekt ist keine Instanz der Deklaration Klasse

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) 

Ich brauchte eine Instanz dieser Schnittstelle für die Prüfung:

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; 

} 

diese Schnittstelle erweitert diese eine (nur eine leere Marker-Schnittstelle):

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

In meinem Test habe ich versucht, diese einfache Sache zu tun:

final ResourceI18nConcern defaultConcern=mock(ResourceI18nConcern.class); 

ich die folgende Stack-Trace erhalten:

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 

Bin ich etwas falsch? Das schien mir, als ob es einfach sein sollte.

Um dieses Problem zu reproduzieren, klonen Sie https://bitbucket.org/globalmentor/rincl.git und überprüfen Sie Commit 2f88d7c5e5ac17b6d316ed54c12cb7b447b7d6ac. Dann versuchen Sie den folgenden Test auszuführen:

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

Nicht genug Informationen: Java-Version, aktueller Test, OSGI, etc.? Ich habe kein Problem damit, den oben erwähnten Code zu verspotten. Für mich scheint dies ein Classloading-Problem zu sein, das durch das Setup der Umgebung verursacht werden kann. – Brice

+0

Aber mit einem zweiten Blick auf den Stacktrace kann dies wie ein Problem ein Classloading-Problem, verursacht durch die Android-Umgebung Setup aussehen. Dies könnte etwas sein, mit dem Bytebuddy jedoch umgehen kann. – Brice

+0

OK, @Brice, ich habe einen spezifischen Commit hinzugefügt, damit Sie den Testcode und den spezifischen Testcode auschecken können. –

Antwort

13

Ihre Java-Runtime-Version ist ab März 2014; Viele Fehler wurden seither in der VM behoben und Sie sollten wirklich upgraden. Ich bin zu 99% sicher, dass dieses Problem mit Typ Anmerkungen (@NonNull) verbunden ist, die in dieser Version zum ersten Mal in dieser exakten Version eingeführt wurden. Ich bin mir sicher, dass Ihr Problem verschwinden wird, wenn Sie Ihre VM aktualisieren.

Ich kann Ihren vorgeschlagenen Test mit einem kürzlichen Build der HotSpot VM erfolgreich ausführen.

Verwandte Themen