web-dev-qa-db-ja.com

SpringJUnit4ClassRunner.withAfterClassesメソッドで不可解なMultipleFailureExceptionエラーメッセージが表示される理由

春のテストのセットアップが失敗し、以下のあまり役に立たないエラーメッセージが表示されるのはなぜですか?すべての提案を歓迎します。

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-場所[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]

これがターゲットスニペットです

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

...
}
12
000

更新-2015年9月

Spring Framework 4.2.2は、JUnit 4.9がクラスパスにない場合、より意味のある例外をスローします。詳細については、 SPR-13521 を参照してください。


以下は、SpringJUnit4ClassRunnerのクラスレベルのJavadocからの抜粋です。

注:Spring Framework 4.1以降、このクラスにはJUnit4.9以降が必要です。

問題のクラスMultipleFailureExceptionは、JUnit4.9で導入されました。

そのため、テストはClassNotFoundExceptionで失敗します。

したがって、JUnit 4.9(またはできれば4.12)にアップグレードすると、問題が解決します。

よろしく、

サム(Spring TestContext Frameworkの作成者

23
Sam Brannen