Почему загадочное сообщение об ошибке MultipleFailureException с помощью метода SpringJUnit4ClassRunner.withAfterClasses
Почему мой весенний тест провалился со следующими не очень полезными сообщениями об ошибках ниже? Все предложения приветствуются.
Выход 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
Консольный выход
ИНФОРМАЦИЯ: org.springframework.test.context.support.DefaultTestContextBootstrapper - загруженные имена классов TestExecutionListener по умолчанию из местоположения [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecution.sprf. Org, test или org.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener. context.support.DefaultTestContextBootstrapper - не удалось создать экземпляр TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]. Укажите пользовательские классы слушателей или сделайте классы слушателей по умолчанию (и их обязательные зависимости) доступными. Оскорбляющий класс: [org/springframework/ транзакция / перехватчик /TransactionAttribute] INFO: org.springframework.test.context.support.DefaultTestContextBootstrapper - не удалось создать экземпляр TestExecutionListener [org.springframework.test.conTeranschange.testTrans история. Укажите пользовательские классы слушателей или сделайте классы слушателей по умолчанию (и их обязательные зависимости) доступными. Оскорбляющий класс: [org/springframework/ транзакция / перехватчик /TransactionAttributeSource] INFO: org.springframework.test.context.support.DefaultTestContextBootstrapper - использование TestExecutionListeners: [org.springframework.est.conteecu.Terg.weg.prg.weg.serg.95 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;
...
}
1 ответ
Обновление - сентябрь 2015
Spring Framework 4.2.2 выдает более значимое исключение, если JUnit 4.9 не находится в пути к классам. См. SPR-13521 для деталей.
Ниже приводится выдержка из Javadoc на уровне класса для SpringJUnit4ClassRunner
:
ПРИМЕЧАНИЕ. Начиная с Spring Framework 4.1, для этого класса требуется JUnit 4.9 или выше.
Класс, о котором идет речь, MultipleFailureException
, был введен в JUnit 4.9.
Вот почему ваш тест не проходит с ClassNotFoundException
,
Поэтому обновление до JUnit 4.9 (или, предпочтительно, 4.12) решит вашу проблему.
С Уважением,
Сэм (автор Spring TestContext Framework)