2017-02-09 99 views
1

mvn integration-testフェーズを実行しようとしていますが、統合テストを実行すると(ユニットテストが正しく実行される)、Failed to load ApplicationContextエラーが発生します。私はSpringJUnit4ClassRunnerクラスでテストを実行しています。統合テストを実行するときにApplicationContextを読み込めませんでした

これは、完全なスタックトレースです:

2017-02-09 03:22:15.705 [main] ERROR o.s.t.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframewor[email protected]5c072e3f] to prepare test instance [[email protected]] 
java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    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:678) 
    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.IllegalStateException: Neither GenericXmlContextLoader nor AnnotationConfigContextLoader was able to load an ApplicationContext from [[email protected] testClass = AccountServiceIT, locations = '{}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]. 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:263) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
    ... 25 common frames omitted 

また、私は原型を使用している、あなたは注釈付きConfigurationクラスhereを見ることができます。私は間違って何をしていますか?

これは私のテストクラスです:

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional 
public class PatientServiceIT { 

    private static final String EMAIL = "[email protected]"; 
    private static final String NAME = "test"; 
    private static final String SURNAMES = "account"; 
    private static final String PASSWORD = "testaccount"; 
    private static final String POSTAL_CODE = "15002"; 
    private static final String MOBILE_NUMBER = "694749217"; 

    @Autowired 
    private AccountRepository accountRepository; 

    @Autowired 
    private PatientRepository patientRepository; 

    @Autowired 
    private PatientService patientService; 

    private PatientDetails createPatientDetails() { 
     return new PatientDetails(EMAIL, PASSWORD, NAME, SURNAMES, MOBILE_NUMBER, POSTAL_CODE); 
    } 

    private Account createPatient() { 
     Account patientAccount = new Account(EMAIL, PASSWORD, NAME, SURNAMES, Role.ROLE_DENTIST); 
     Patient patient = new Patient(POSTAL_CODE, MOBILE_NUMBER); 
     patientAccount.setPatient(patient); 
     return patientAccount; 
    } 

    @Test 
    public void savePatient() { 
     // call 
     Patient patient = patientService.save(createPatientDetails()); 

     // assert 
     assertEquals(patient.getAccount(), createPatient()); 
    } 

} 

PS:私はintegration-test目標と確実なポルtest目標のためにMavenのフェイルセーフを訴えています。

+0

あなたはあなたの設定を完全にJavaで駆動していますか、まだApplicationContext.xmlを持っていますか? –

+0

関連するテストクラス、「AccountServiceIT」も表示できますか? – Morfic

+0

こんにちはT.Jung私はJavaの設定を使用しています。 –

答えて

2

あなたのテストで@ContextConfiguration(classes = ...)アノテーションを使ったコンテキストの定義がありません。 classesとして、単一の構成またはすべての他のすべてを含む本番全体のアプリケーションのコンテキストを定義できます。必要な設定クラスだけを宣言することの利点は、テストのブートストラップ全体がより高速であることです。

注:Springテストは、指定されたアプリケーションコンテキストをキャッシュします。あなたが全体の設定で9/10のテストを実行しなければならないなら、新しいconfigの設定を宣言するよりも、全体の設定を使うのにかかる時間が短くなります。しかし、統合テストのための小さな設定フットプリントを得て、作業中のドメインスライスに集中し、他のコンテキスト設定を処理したり保守したりする必要がないようにする必要があります。

一般的に、SpringJUnit4ClassRunnerで実行するテストでは、実行するアプリケーションコンテキストが必要です。 詳細を読む:Link to the spring docs

+0

で私の質問を更新しましたこんにちは!私は '@ContextConfiguration(classes = Application.class)'でテストクラスに注釈をつけようとしましたが、動作しません。 'WebSecurityConfigurationAware'でテストクラスを拡張するとうまく動作しますが、なぜ、私は理解できません。それに関する情報を見つけてください。 –

+0

あなたは何らかのこのhttps://github.com/kolorobot/spring-mvc-quickstart-archetype/blob/master/src/main/resources/archetype-resources/src/test/を意味します。 java/config/WebSecurityConfigurationAware.java(Google検索)。だからあなたは春のセキュリティを使用していますか?上記のようにアプリケーション全体を含める場合は、 '.addFilters(springSecurityFilterChain)'(チェーンをautowired /注入する必要があります)で正しい設定を行う必要もあります。 – meistermeier

+0

こんにちは、それは働いています、ありがとう!しかし、なぜ私はSpringセキュリティーチェーンにフィルターを追加する必要がありますか? –

関連する問題