2016-07-01 6 views
1

以下はMy Beanの設定コードですが、ApplicationContextのロードに失敗したというテストに合格しません。私が間違っていることはありますか?私は(インターフェイスメソッドを除く)必要なのは、各クラスのメソッドに@Autowireを追加しましたが、私はまだそれが外観を持つためSpringでの動作第2章XML BeanをJavaConfigに変更すると、テストに合格しません。

package soundsystems; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class CDPlayerConfig 
{ 
    @Bean 
    public CompactDisc sgtPeppers() 
    { 
     return new SgtPeppers(); 
    } 

    @Bean(name = "SgtPepperPlayer") 
    public CDPlayer cdPlayer() 
    { 
     return new CDPlayer(sgtPeppers()); 
    } 

    @Bean(name = "AnyCDPlayer") 
    public CDPlayer cdPlayer(CompactDisc cd) 
    { 
     return new CDPlayer(cd); 
    } 

    @Bean 
    public BlankDisc reallyBlankDisc() 
    { 
     return new BlankDisc(); 
    } 

    @Bean 
    public BlankDisc blankDisc() 
    { 
     BlankDisc bd = new BlankDisc(); 

     String title = "Sgt. Pepper's Lonely Hearts Club Band"; 
     String artist = "The Beatles"; 

     List<String> tracks = new ArrayList<String>(); 
     tracks.add("Sgt. Pepper's Lonely Hearts Club Band"); 
     tracks.add("With a Little Help from My Friends"); 
     tracks.add("Lucy in the Sky with Diamonds"); 
     tracks.add("Getting Better"); 
     tracks.add("Fixing a Hole"); 

     bd.setTitle(title); 
     bd.setArtist(artist); 
     bd.setTracks(tracks); 

     return bd; 
    } 

    @Bean 
    public Discography beatlesDiscography() 
    { 
     Discography dg = new Discography(); 

     String artist = "The Beatles"; 
     CompactDisc SgtPeppers = new SgtPeppers(); 
     CompactDisc WhiteAlbum = new WhiteAlbum(); 
     CompactDisc HardDaysNight = new HardDaysNight(); 
     CompactDisc Revolver = new Revolver(); 

     List<CompactDisc> cds = new ArrayList<CompactDisc>(); 
     cds.add(SgtPeppers); 
     cds.add(WhiteAlbum); 
     cds.add(HardDaysNight); 
     cds.add(Revolver); 

     dg.setArtist(artist); 
     dg.setCDs(cds);  

     return dg; 
    } 

} 



package soundsystems; 

import static org.junit.Assert.*; 

import org.junit.Rule; 
import org.junit.Test; 
import org.junit.contrib.java.lang.system.SystemOutRule; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = CDPlayerConfig.class) 
public class CDPlayerTest 
{ 
    @Rule 
    public final SystemOutRule log = new SystemOutRule().enableLog(); 

    @Autowired 
    private CompactDisc cd; 

    @Autowired 
    private MediaPlayer player; 

    @Test 
    public void cdShouldNotBeNull() 
    { 
     assertNotNull(cd); 
    } 

    @Test 
    public void play() 
    { 
     player.play(); 
     assertEquals("Playing Sgt. Pepper's Lonely Hearts Club Band" + " by The Beatles\n", log.getLog()); 
    } 
} 

感謝をロードしていない理由はわかりません。

編集:エラー

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:228) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:230) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:249) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) 
    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:193) 
    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: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: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AnyCDPlayer': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void soundsystems.CDPlayer.setCompactDisc(soundsystems.CompactDisc); nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [soundsystems.CompactDisc] is defined: expected single matching bean but found 3: blankDisc,sgtPeppers,reallyBlankDisc 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
    ... 25 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void soundsystems.CDPlayer.setCompactDisc(soundsystems.CompactDisc); nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [soundsystems.CompactDisc] is defined: expected single matching bean but found 3: blankDisc,sgtPeppers,reallyBlankDisc 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:661) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 41 more 
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [soundsystems.CompactDisc] is defined: expected single matching bean but found 3: blankDisc,sgtPeppers,reallyBlankDisc 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1126) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:618) 
    ... 43 more 
+0

例外の完全なスタックトレースは何ですか?あなたがエラーを読むことができれば、エラーが何であるかを見つけることはずっと簡単です。 –

+0

@JBNizetエラーを追加しました。 – Aesis

答えて

0

誤差は非常に明確である:

Could not autowire method: public void soundsystems.CDPlayer.setCompactDisc(soundsystems.CompactDisc); 
nested exception is 
org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [soundsystems.CompactDisc] is defined: 
expected single matching bean but found 3: blankDisc,sgtPeppers,reallyBlankDisc 

春はの豆とそれを呼び出そうとしたので、あなたは、@AutowiredであなたCDPLAYERでsetCompactDisc()メソッドを注釈付きコンパクトディスクをタイプするが、そのうち3つを持っているので、どれを注入するかを決めることはできない。このメソッドにAutowiredアノテーションを付けないでください。コンパクトディスクがコンストラクタによって既に初期化されているので、その方法を削除することもできます。

+0

ああありがとうございます。私はSpring in Actionで学習を始めました。それはAutowiredを使用していたので、私はそれを使用しなければならないと思いました。 – Aesis

2

私は春の@Autowiredのデフォルトモードは種類によって異なると信じています。これは、Springがインタフェース型でBeanをautowireしようとしていることを意味します。同じインタフェースを持つ3つのBeanがあり、Springはどちらを選択するのか混乱してしまいます。オートワイヤリングを名前で実現する場合は、@Qualifierを使用してください。@Qualifier("beanname")

+0

ありがとう、@Qualifierを使ってテストクラスでBean名を割り当ててもうまくいきました。 – Aesis

関連する問題