Spring 4.1.7 + Junit 4.12从eclipse执行时无法正常工作

时间:2015-11-16 22:23:37

标签: java eclipse spring maven junit

我只是试图在我们的spring应用程序中实现单元测试并在从eclipse执行junit测试时获得异常。

java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationUtils.isInJavaLangAnnotationPackage(Ljava/lang/annotation/Annotation;)Z
    at org.springframework.test.util.MetaAnnotationUtils.findAnnotationDescriptor(MetaAnnotationUtils.java:117)
    at org.springframework.test.util.MetaAnnotationUtils.findAnnotationDescriptor(MetaAnnotationUtils.java:88)
    at org.springframework.test.context.support.ActiveProfilesUtils.resolveActiveProfiles(ActiveProfilesUtils.java:80)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:367)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:305)
    at org.springframework.test.context.DefaultTestContext.<init>(DefaultTestContext.java:67)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:103)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:124)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:115)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    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.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    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)

我的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.my.playground</groupId>
  <artifactId>sample</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>sample Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.1.7.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.7.RELEASE</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
  <build>
    <finalName>sample</finalName>
  </build>
</project>

我执行下面的文件来获取异常。 从eclipse文件执行步骤 - &gt;右键单击 - &gt;运行方式 - &gt; Junit测试

package junit;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class)
public class JunitSpringExample {

    @Autowired
    private SampleService sampleService;

    @Test
    public void testSampleService() {
        // Just to make sure this method works
        Assert.assertTrue(true);
    }
}

我也尝试使用这两个弹簧版本4.1.74.2.3,在这些解决方案中获得相同的错误并没有帮助我,因为我的pom.xml只有4.x版本。

Eclipse Kepler版本正在使用

3 个答案:

答案 0 :(得分:0)

根据Eclipse的配置方式,运行/调试配置在类路径上没有Spring库是可能的 - 它不一定足以让它们存在于POM中。

检查调试配置&gt; {您的调试配置}&gt;类路径 您可能需要在“用户条目”下手动添加它们。首先要看看是否存在问题

答案 1 :(得分:0)

表面上看,这似乎是jar版本的问题。

我建议解决此版本问题的方法是使用BOM-Bill of Material

这将允许您跳过显式添加版本,并提供最新版本。

要使用BOM,请在您的部分添加以下内容:

<dependencyManagement> 
   <dependencies> 
    <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-framework-bom</artifactId> 
      <version>4.0.0.RC2</version> 
      <type>pom</type> 
      <scope>import</scope>
    </dependency> 
   </dependencies> 
</dependencyManagement>

您可以简单地声明通常的Spring Framework依赖项,而无需指定:

 <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
    </dependency>

试试看,希望这能解决你的问题。

答案 2 :(得分:0)

基于Spring文档:  (https://docs.spring.io/spring/docs/4.1.7.RELEASE/spring-framework-reference/html/testing.html)您必须将JUnit的版本设置在4.9和4.11之间

在Spring文档中检查JUnit版本非常重要。这个可能会改变。

这里是Spring 4.1.7的解释:

  

Spring TestContext Framework通过自定义运行器(在JUnit 4.9 - 4.11上测试)提供与JUnit 4.9+的完全集成。通过使用@RunWith(SpringJUnit4ClassRunner.class)注释测试类,开发人员可以实现基于JUnit的标准单元和集成测试,同时获得TestContext框架的好处,例如支持加载应用程序上下文,依赖注入测试实例,事务测试方法执行,等等。

希望得到这个帮助。