2014-02-19 53 views
19

這裏是我使用的文件:如何使用Spring Autowire編寫JUnit測試?

component.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> 

    <context:component-scan 
     base-package="controllers,services,dao,org.springframework.jndi" /> 
</beans> 

ServiceImpl.java

@org.springframework.stereotype.Service 
public class ServiceImpl implements MyService { 

    @Autowired 
    private MyDAO myDAO; 

    public void getData() {...}  
} 

ServiceImplTest.java

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath*:conf/components.xml") 
public class ServiceImplTest{ 

    @Test 
    public void testMyFunction() {...} 
} 

錯誤:

16:22:48.753 [main] ERROR o.s.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframewor[email protected]2092dcdb] to prepare test instance [[email protected]] 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'services.ServiceImplTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private services.ServiceImpl services.ServiceImplTest.publishedServiceImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [services.ServiceImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) ~[spring-beans.jar:3.1.2.RELEASE] 
+0

1.您的上下文配置提及'components.xml',但是你的文件叫做'Componet.xml'(可能只是在這篇文章中輸入錯誤)2.你的Component.xml中沒有爲'PublishedReferenceYieldDAO'類定義的bean –

+0

也指定了組件掃描兩次。一個在xml中,另一個在註釋中。只需要其中一個。 – MystyxMac

+0

@DanTemple錯誤後..實際上我的文件名是component.xml – Premraj

回答

14

確保您導入了正確的軟件包。如果我記得正確的話,Autowiring有兩種不同的軟件包。應該是:org.springframework.beans.factory.annotation.Autowired;

而且這看起來奇怪的對我說:

@ContextConfiguration("classpath*:conf/components.xml") 

這裏是爲我工作得很好的例子:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "/applicationContext_mock.xml" }) 
public class OwnerIntegrationTest { 

    @Autowired 
    OwnerService ownerService; 

    @Before 
    public void setup() { 

     ownerService.cleanList(); 

    } 

    @Test 
    public void testOwners() { 

     Owner owner = new Owner("Bengt", "Karlsson", "Ankavägen 3"); 
     owner = ownerService.createOwner(owner); 
     assertEquals("Check firstName : ", "Bengt", owner.getFirstName()); 
     assertTrue("Check that Id exist: ", owner.getId() > 0); 

     owner.setLastName("Larsson"); 
     ownerService.updateOwner(owner); 
     owner = ownerService.getOwner(owner.getId()); 
     assertEquals("Name is changed", "Larsson", owner.getLastName()); 

    } 
+0

1.正如你提到的導入包。我使用相同的2.我使用的框架文件夾「conf」包含components.xml和文件夾「app」包含java代碼。 – Premraj

+0

如何只運行這個測試@PeterParker –

+0

* classpath *:conf/components.xml *是**全局命令**更多http://stackoverflow.com/tags/glob/info – Premraj

0

我覺得在某處你的代碼是你@Autowiring具體類ServiceImpl,你應該自動裝配它的界面(大概MyService)。

+0

仔細檢查是否有其他實例,並且上下文實際上是使用實現類查找包。在這些情況下,在Spring中使用log4j並切換org.springframework包層次結構的調試會很有幫助 - 您可以查看它正在考慮的內容,然後執行操作。 – jmkgreen