【问题标题】:Error while running spring boot tests, SpringRunner.class Not found运行spring boot测试时出错,找不到SpringRunner.class
【发布时间】:2019-02-17 14:06:10
【问题描述】:

当我尝试从我的 Spring Boot 应用程序调用 JUnit 测试用例时,我收到以下错误:

我在我的测试类中使用了这个注解。

@RunWith(SpringRunner.class)

从项目依赖项添加 JUnit 库后,出现以下错误:

java.lang.TypeNotPresentException: Type org.springframework.test.context.junit4.SpringRunner not present
    at sun.reflect.annotation.TypeNotPresentExceptionProxy.generateException(TypeNotPresentExceptionProxy.java:46)
    at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:84)
    at com.sun.proxy.$Proxy2.value(Unknown Source)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:87)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:73)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:46)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:522)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: java.lang.ClassNotFoundException: org.springframework.test.context.junit4.SpringRunner
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    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:439)
    at sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:420)
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:349)
    at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72)
    at java.lang.Class.createAnnotationData(Class.java:3521)
    at java.lang.Class.annotationData(Class.java:3510)
    at java.lang.Class.getAnnotation(Class.java:3415)
    at org.junit.internal.builders.IgnoredBuilder.runnerForClass(IgnoredBuilder.java:10)
    ... 11 more

这是我的 gradle 依赖项:

另外,我在类路径中有受影响的类:

我的 Spring Boot 版本是 2.0.4。编辑器是 SpringToolSuite。有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

    标签: spring-boot spring-test junit5 spring-test-mvc springrunner


    【解决方案1】:

    您不需要通过 Eclipse 的“JUnit 库”引入 JUnit 4 依赖项。

    相反,您应该使用spring-boot-starter-test 依赖项传递(并自动)引入的JUnit 4 版本。这应该会为您引入 JUnit 4.12,这是所有现代版本的 Spring Boot Test 所必需的。

    如果这不能帮助您解决问题,请发布您的整个 Gradle 构建脚本(或尽可能多地分享)。

    【讨论】:

    • 感谢您的提及,我在 spring 文档中阅读了相同的内容,并希望它能够在不明确添加的情况下工作。但是,我尝试了我的帖子中提到的方法,看看它是否有帮助。
    【解决方案2】:

    我认为你错过了 JUnit 的依赖,因为它就像 spring 试图在 org/junit/ 中找到一些东西,但你没有那个。

    我从不使用 gradle,但对于 maven,它应该如下所示。

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
    </dependency>
    

    希望这会有所帮助。

    【讨论】:

    • 即使在 gradle 中添加了 junit 依赖项后我也没有帮助:testCompile('junit:junit:4.12')
    • 您能否为我扩展您的所有依赖项。我想查看您需要的每个 jar 文件的版本。也许这个错误可能是由于某些依赖的版本冲突引起的。
    • 我添加了我的 gradle 依赖项的截图
    • 从您的回答来看,首先,您的 gradle 依赖项中不需要 jackson.corehibernate-validator,因为它们已经包含在 spring-boot-starter-web 中。也很抱歉提供错误信息,junit 也包含在 spring-boot-starter-test 中,并确保您使用的是 spring-boot-starter-parent 版本 2.0.4.RELEASE
    【解决方案3】:

    我尝试通过使用 Gradle 创建另一个示例项目来运行 Junit,它运行良好,并且惊讶地发现下面是我的帖子中提到的两个依赖项创建问题。如果我删除这些依赖项,它就可以正常工作。不知道这里发生了什么:

    编译('org.springframework.boot:spring-boot-starter-data-jpa') 编译('com.fasterxml.jackson.core:2.9.6')

    【讨论】:

    • 您能否提供一个指向您的示例项目的链接或至少提供整个build.gradle 文件?
    • 我已经添加了我的 gradle 依赖项的截图。
    【解决方案4】:

    @trjade,这是我的依赖项截图:

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2018-08-25
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多