2015-05-04 23 views
9

Dlaczego konfiguracja testu sprężynowego kończy się niepowodzeniem z poniższymi niezbyt przydatnymi komunikatami o błędach? Wszystkie sugestie są doceniane.Dlaczego komunikat o błędzie wielopostaciowego wyjątku z metodą SpringJUnit4ClassRunner.withAfterClasses

JUnit wyjścia

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 

Console Output

INFO: org.springframework.test.context.support.DefaultTestContextBootstrapper - Loaded domyślna klasa TestExecutionListener nazwy od lokalizacji [META-INF /spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springf ramework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] INFO: org.springframework.test.context.support.DefaultTestContextBootstrapper - Could nie tworzy instancji TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]. Określ niestandardowe klasy nasłuchiwania lub ustaw domyślne klasy detektorów (i ich wymagane zależności). Klasa powodująca obrażenia: [org/springframework/transaction/interceptor/TransactionAttribute] INFO: org.springframework.test.context.support.DefaultTestContextBootstrapper - Nie można utworzyć instancji TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener]. Określ niestandardowe klasy nasłuchiwania lub ustaw domyślne klasy detektorów (i ich wymagane zależności). Klasa powodująca obrażenia: [org/springframework/transaction/interceptor/TransactionAttributeSource] INFO: org.springframework.test.context.support.DefaultTestContextBootstrapper - przy użyciu TestExecutionListeners: [or[email protected]76959acc, org.springframework .test.context.support.DependencyInjectionTestExecutionListener @ 57e603e6, org.springfra[email protected]3e0a1e1f]

Oto urywek docelowemu

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

a test snippet

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

public class PipAppsTest { 

@Mock 
SitePreferenceHandler sitePreferenceHandler; 

@Autowired 
PipApps pipApps; 

... 
} 
+0

Co nie jest tak przydatne? Sądząc po śladzie stosu, używasz niekompatybilnej wersji JUnit 4 z testem sprężystym. –

+0

Używałem JUnit 4.7. Teraz poszedłem zgodnie z Twoją rekomendacją i zaktualizowałem ją do najnowszej wersji JUnit 4.12. Błąd przestał występować. Ten komunikat o błędzie jest jednak zagadkowy i dlatego nie jest zbyt użyteczny. Ale przypuszczam, że za tą niejasnością kryje się dobry powód. – 000

Odpowiedz

22

Aktualizacja - wrzesień 2015

Spring Framework 4.2.2 rzuca bardziej znaczący wyjątek jeśli JUnit 4.9 nie jest w ścieżce klasy. Aby uzyskać szczegółowe informacje, patrz SPR-13521.


Poniżej znajduje się fragment Javadoc poziomie klasy SpringJUnit4ClassRunner:

UWAGA: jako Spring ram 4,1, klasa ta wymaga JUnit 4,9 lub wyższej.

Klasa, o której mowa, MultipleFailureException, została wprowadzona w JUnit 4.9.

Właśnie dlatego Twój test kończy się niepowodzeniem z ClassNotFoundException.

Aktualizacja do JUnit 4.9 (lub najlepiej 4.12) rozwiąże zatem Twój problem.

Pozdrawiam,

Sam (autor Wiosna TestContext ramowego)

+0

Witam, zaktualizowałem wersję Junit do wersji 4.9 w moim projekcie, ale nadal otrzymuję ten sam błąd. – Pruthviraj

+0

Jeśli otrzymujesz wiadomość ze Springa, że ​​JUnit 4.9 jest wymagany, oznacza to, że nie zaktualizowałeś swojego projektu, aby użyć JUnit 4.9. Na przykład możesz pobierać różne wersje JUnit jako zależności przechodnie. Sprawdź więc, jak JUnit jest wciągany na twój wykres zależności. –

Powiązane problemy