【问题标题】:Why the cryptic MultipleFailureException error message with the SpringJUnit4ClassRunner.withAfterClasses method为什么使用 SpringJUnit4ClassRunner.withAfterClasses 方法出现神秘的 MultipleFailureException 错误消息
【发布时间】:2015-07-13 23:37:07
【问题描述】:

为什么我的 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 - 从位置 [META-INF/spring.factories] 加载默认 TestExecutionListener 类名:[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] 信息:org.springframework.test.context.support.DefaultTestContextBootstrapper - 无法实例化 TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]。指定自定义侦听器类或使默认侦听器类(及其所需的依赖项)可用。违规类:[org/springframework/transaction/interceptor/TransactionAttribute] 信息:org.springframework.test.context.support.DefaultTestContextBootstrapper - 无法实例化 TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener]。指定自定义侦听器类或使默认侦听器类(及其所需的依赖项)可用。违规类:[org/springframework/transaction/interceptor/TransactionAttributeSource] 信息:org.springframework.test.context.support.DefaultTestContextBootstrapper - 使用 TestExecutionListeners:[org.springframework.test.context.web.ServletTestExecutionListener@76959acc,org.springframework.test.context.support.DependencyInjectionTestExecutionListener@57e603e6,org.springframework。 test.context.support.DirtiesContextTestExecutionListener@3e0a1e1f]

这里是目标sn-p

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

还有测试sn-p

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

public class PipAppsTest {

@Mock
SitePreferenceHandler sitePreferenceHandler;

@Autowired
PipApps pipApps;

...
}

【问题讨论】:

  • 什么没那么有用?从堆栈跟踪来看,您使用的是与 Spring Test 不兼容的 JUnit 4 版本。
  • 我使用的是 JUnit 4.7。我现在已经按照你的建议升级到了最新的 JUnit 版本 4.12。错误已停止发生。该错误消息虽然很神秘,因此不是很有用。但我认为模糊背后有充分的理由。

标签: spring spring-mvc testing springjunit4classrunner


【解决方案1】:

更新 -- 2015 年 9 月

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


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

注意:从 Spring Framework 4.1 开始,此类需要 JUnit 4.9 或更高版本。

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

这就是为什么您的测试使用 ClassNotFoundException 失败的原因。

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

问候,

Sam(Spring TestContext 框架的作者

【讨论】:

  • 您好,我已经在我的项目中将 Junit 版本升级到 4.9,但仍然遇到同样的错误。
  • 如果您从 Spring 收到需要 JUnit 4.9 的消息,那么您还没有成功升级您的项目以使用 JUnit 4.9。例如,您可能会引入不同版本的 JUnit 作为传递依赖项。因此,请验证 JUnit 是如何被拉入您的依赖关系图中的。
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 2014-08-14
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多