2014-02-06 47 views
4
java.lang.IllegalStateException: Failed to transform class with name com.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$ReadSets. Reason: null 
    at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:219) 
    at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:147) 
    at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:264) 
    at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) 
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125) 
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) 
    at sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:390) 
    at sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:371) 
    at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:673) 
    at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:480) 
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:306) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:241) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:88) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70) 
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3089) 
    at java.lang.Class.getAnnotations(Class.java:3069) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.classAnnotations(PowerMockJUnit44RunnerDelegateImpl.java:163) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.getDescription(PowerMockJUnit44RunnerDelegateImpl.java:155) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.getDescription(JUnit4TestSuiteChunkerImpl.java:171) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.getDescription(AbstractCommonPowerMockRunner.java:47) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.sendTree(JUnit4TestClassReference.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.sendTrees(RemoteTestRunner.java:476) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:464) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.NullPointerException 
    at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:110) 
    at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:96) 
    at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:704) 
    at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681) 
    at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156) 
    at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45) 
    at javassist.compiler.Javac$1.setReturnType(Javac.java:449) 
    at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:146) 
    at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45) 
    at javassist.compiler.TypeChecker.atVariableAssign(TypeChecker.java:248) 
    at javassist.compiler.TypeChecker.atAssignExpr(TypeChecker.java:217) 
    at javassist.compiler.ast.AssignExpr.accept(AssignExpr.java:38) 
    at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:235) 
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:323) 
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49) 
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:344) 
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49) 
    at javassist.compiler.CodeGen.atIfStmnt(CodeGen.java:384) 
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:348) 
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49) 
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:344) 
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49) 
    at javassist.compiler.Javac.compileStmnt(Javac.java:558) 
    at javassist.expr.MethodCall.replace(MethodCall.java:233) 
    at org.powermock.core.transformers.impl.MainMockTransformer$PowerMockExpressionEditor.edit(MainMockTransformer.java:299) 
    at javassist.expr.ExprEditor.loopBody(ExprEditor.java:178) 
    at javassist.expr.ExprEditor.doit(ExprEditor.java:90) 
    at javassist.CtClassType.instrument(CtClassType.java:1224) 
    at org.powermock.core.transformers.impl.MainMockTransformer.transform(MainMockTransformer.java:75) 
    at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:215) 
    ... 28 more 

這個類包含一個靜態方法的getInstance(我想模擬),以提供一個單件對象和一對夫婦枚舉類嘲笑一個類時錯誤聲明爲公共靜態(其中一個名爲ReadSet的異常)。下面是課程的樣子。「無法與名稱變換類」用靜態枚舉類

我試圖嘲弄使用PowerMockito.mock和Powermockito.MockStatic我的測試方法這個類,它拋出異常。

任何有關如何修復它的線索?

public class XXX extends YYY { 

    private volatile static XXX s_instance; 

    public static XXX getInstance() { 
     if (s_instance == null) 
      synchronized (XXX.class) { 
       if (s_instance == null) 
        s_instance = new XXX(); 
      } 
     return s_instance; 
    } 

    public static enum ReadSets { 
     ANY(1), ALL(2); 
     int val; 

     public int getVal() { 
      return val; 
     } 

     private ReadSets(int v) { 
      val = v; 
     } 
    } 

    public static enum UpdateSets { 
     ANY(1), ALL(2); 
     int val; 

     private UpdateSets(int v) { 
      val = v; 
     } 
    } 

    // [...] 

} 

回答

0

我在我的一個測試中遇到了同樣的問題,對我來說這是由於javassist版本衝突造成的。 一些依賴性使用javassist.javassist-3.4.GA而PowerMock使用org.javassist.javassist-3.18.1-GA(在有機是主要的差異)。 看來,eclipse先把前一個放到classpath中,所以使用了舊版本。

我用maven,所以我可以通過創建直接把它和依賴於較新版本jassist依賴內javassist.javassist排除規則解決衝突。不是最好的解決辦法,但我不知道有更好的方法來處理這些在maven中的人工移動。

<dependency> 
    <groupId>some</groupId> 
    <artifactId>dependency</artifactId> 
    <version>1.0</version> 
    <exclusions> 
    <exclusion> 
     <groupId>javassist</groupId> 
     <artifactId>javassist</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>org.javassist</groupId> 
    <artifactId>javassist</artifactId> 
    <version>3.18.2-GA</version> 
</dependency> 

當然,您必須檢查依賴項是否仍然適用於該版本。

0

我面臨同樣的問題,並提到這裏的答案。事實證明鮑里斯是正確的。 PowerMock引入了版本3.18.2-GA的javassist,這會導致一些事情的失誤。在我的情況下,只有當我嘗試構建整個項目時,某些單元測試纔會失敗。

我添加以下依賴

<dependency> 
     <groupId>javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.4.GA</version> 
     <scope>test</scope> 
    </dependency> 

這樣Powermock很滿意自己的了Javassist(org.javassist)和測試樂於接受新的了Javassist 3.4.GA.

但是,我不知道是什麼原因造成的測試,以在第一時間失敗,只有當我建立了整個項目。