spring - 为什么使用 SpringJUnit4ClassRunner.withAfterClasses 方法出现神秘的 MultipleFailureException 错误消息

标签 spring spring-mvc testing springjunit4classrunner

为什么我的 spring 测试设置失败并出现以下不太有用的错误消息?欢迎提出所有建议。

JUnit 输出

java.lang.NoClassDefFoundError: org/junit/runners/model/MultipleFailureException
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.withAfterClasses(SpringJUnit4ClassRunner.java:188)
at org.junit.runners.ParentRunner.classBlock(ParentRunner.java:145)
at org.junit.runners.ParentRunner.run(ParentRunner.java:235)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:163)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
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.ClassNotFoundException: org.junit.runners.model.MultipleFailureException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 10 more

控制台输出

INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Could not instantiate TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [org/springframework/transaction/interceptor/TransactionAttribute] INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Could not instantiate TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [org/springframework/transaction/interceptor/TransactionAttributeSource] INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@76959acc, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@57e603e6, org.springframework.test.context.support.DirtiesContextTestExecutionListener@3e0a1e1f]

这是目标片段

@Service 

public class PipApps {

@Resource( name = "apps" )
private Properties apps;

@Autowired
private SitePreferenceHandler sitePreferenceHandler;

@Autowired
private PipsTable pipsTable;

private SitePreference sitePreference;

private Device device;  

public PipApps( HttpServletRequest request, HttpServletResponse response ){
    sitePreference = sitePreferenceHandler.handleSitePreference( request, response );
    device = DeviceUtils.getRequiredCurrentDevice( request );
}

public Properties getApps(){
    return apps;
}

public Device getDevice(){
    return device;
}

public SitePreference getSitePreference(){
    return sitePreference;
}

public DeviceRouteTable getPipsTable(){
    return pipsTable;
}
}

还有测试片段

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( locations={"src/test/resources/PipAppsTest-context.xml"} )

public class PipAppsTest {

@Mock
SitePreferenceHandler sitePreferenceHandler;

@Autowired
PipApps pipApps;

...
}

最佳答案

更新 -- 2015 年 9 月

如果 JUnit 4.9 不在类路径中,Spring Framework 4.2.2 会引发更有意义的异常。见 SPR-13521了解详情。


以下是 SpringJUnit4ClassRunner 的类级 Javadoc 的摘录:

NOTE: As of Spring Framework 4.1, this class requires JUnit 4.9 or higher.

有问题的类 MultipleFailureException 是在 JUnit 4.9 中引入的。

这就是您的测试因 ClassNotFoundException 而失败的原因。

因此升级到 JUnit 4.9(或者最好是 4.12)将解决您的问题。

问候,

Sam(Spring TestContext 框架的作者)

关于spring - 为什么使用 SpringJUnit4ClassRunner.withAfterClasses 方法出现神秘的 MultipleFailureException 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032592/

相关文章:

java - Spring Controller 不将 JSON 数据返回到 Angular http GET 调用

java - 从restTemplate 映射到Map<String, Integer>

unit-testing - Go 中最惯用的方法是测试依赖于具有大量方法的结构的代码?

c - 文件可以打开但无法读取 QNX

Golang : reflect. DeepEqual 返回意外的 false

java - Spring Background/Fire and Forget 处理

java - Spring Boot 将 web 应用程序打包为 .jar

java - 如何在 org.springframework.jdbc.CannotGetJdbcConnectionException 上记录 JDBC 连接信息

java - Spring REST 验证响应详细信息

spring - 使用 Spring-MVC 时如何查看来自客户端的 json?