Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;无法转换名为“的类”;使用静态枚举类模拟类时出错_Java_Unit Testing_Junit4_Powermock - Fatal编程技术网

Java &引用;无法转换名为“的类”;使用静态枚举类模拟类时出错

Java &引用;无法转换名为“的类”;使用静态枚举类模拟类时出错,java,unit-testing,junit4,powermock,Java,Unit Testing,Junit4,Powermock,这个类包含一个静态方法getInstance(我想模拟它),以提供一个单例对象和两个声明为公共静态的枚举类(其中一个名为readset的类在异常中可见)。下面是这个班级的样子 我试图在我的测试方法中使用PowerMockito.mock和PowerMockito.MockStatic模拟这个类,它抛出异常 有关于如何修复的线索吗 java.lang.IllegalStateException: Failed to transform class with name com.XXXXXXXXXXX

这个类包含一个静态方法getInstance(我想模拟它),以提供一个单例对象和两个声明为公共静态的枚举类(其中一个名为readset的类在异常中可见)。下面是这个班级的样子

我试图在我的测试方法中使用PowerMockito.mock和PowerMockito.MockStatic模拟这个类,它抛出异常

有关于如何修复的线索吗

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

我在一次测试中遇到了同样的问题,对我来说,这是由javassist版本冲突引起的。 一些依赖项使用javassist.javassist-3.4.GA,而PowerMock使用org.javassist.javassist-3.18.1-GA(org.是主要区别)。 eclipse似乎首先将前者放入类路径,因此使用了较旧的版本

我使用maven,因此我可以通过在拉动它的依赖项中为javassist.javassist创建一个排除规则来解决冲突,并直接依赖于较新的jassist版本。这不是最好的解决方案,但我不知道在maven中有什么更好的方法来处理这些人工制品的移动

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;
        }
    }

    // [...]

}

一些
附属国
1
javassist
javassist
org.javassist
javassist
3.18.2-GA

当然,您必须检查依赖关系是否仍然适用于该版本。

我遇到了同样的问题,并在这里参考了答案。结果证明鲍里斯是对的。PowerMock在3.18.2-GA版本中引入了javassist,这会导致一些问题。在我的例子中,只有当我试图构建整个项目时,某些单元测试才开始失败

我添加了以下依赖项

<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>

javassist
javassist
3.4.GA
测试
这样,Powermock对自己的javassist(org.javassist)感到满意,而测试对新的javassist 3.4.GA感到满意


然而,我不确定最初是什么原因导致测试失败,只有在我构建整个项目时才知道。

谢谢!问题:既然已经添加了排除项,为什么还要添加单独的依赖项?PowerMock不会自动获得所需的javassist版本吗?单独添加依赖项是否与PowerMock已经获得的版本冲突(除非它们相同)?@A.D:是的,你完全正确。我的理由是我比你小6岁-把所有的笑话都放在一边,我再也看不出有什么真正的理由让我们在当时明确地把它包括进去了。要使用更新的版本,我将使用DependencyManager,而这不是问题的一部分。
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.4.GA</version>
        <scope>test</scope>
    </dependency>