2017-02-04 8 views
1

В нашем проекте мы используем весну с Junit для тестирования Junit. Мы использовали аннотацию @ContextConfiguration для загрузки нескольких файлов. У нас есть два класса: AbstractContextJUnitTest и ContextJUnitTest и ContextJUnitTest распространяется AbstractContextJUnitTest.Как отдать предпочтение весеннему бобам с одинаковым идентификатором?

Во время потока кода я заметил, что же боб Id в нескольких файлах с различными типами фасоли. Когда я тестирую эти Junits и получаю ошибку ниже.

Ошибка:

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'voterId' is expected to be of type [com.spring.test2.Student] but was actually of type [com.spring.test2.Parent]

Мое требование Студент боб должен загрузить с VoterId вместо Родитель Bean.

Ниже приведены ява файлы и пружинный боб XML файлы:

test.xml:

<beans> 
    <context:annotation-config/> 
    <bean id="voterId" class="com.spring.test2.Parent"> 
    <property name="Name" value="hai"/> 
    </bean> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" /> 
     <property name="username" value="system" /> 
     <property name="password" value="system" /> 
    </bean> 
    <bean id="transactionManager" 

     class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 

     <property name="dataSource" ref="dataSource" /> 
    </bean> 
</beans> 

test1.xml

<beans> 

    <context:annotation-config/> 
    <bean id="voterId" class="com.spring.test2.Student"> 
     <property name="name" value="hello"/> 
     <property name="number" value="2080"/> 
    </bean> 
</beans> 

AbstractContextJUnitTest.java

@ContextConfiguration(locations="classpath:/com/spring/test2/test1.xml") 
public class AbstractContextJUnitTest extends AbstractTransactionalJUnit4SpringContextTests{ 


} 

ContextJUnitTest.java

@ContextConfiguration(locations={"classpath:/com/spring/test2/test.xml"}) 
public class ContextJUnitTest extends AbstractContextJUnitTest{ 


    @Test 
    public void testStudent(){ 
     Student stud=applicationContext.getBean("voterId",Student.class); 
     assertEquals(stud.getNumber(), 2080); 
    } 
} 

ответ

1

Вы пытались @Primary?

<bean id="voterId" class="com.spring.test2.Student" primary="true"> 
     <property name="name" value="hello"/> 
     <property name="number" value="2080"/> 
</bean> 

Вы должны использовать @Qualifier для com.spring.test2.Parent везде, где вам нужно.

Или вы можете получить боб с типом, как:

applicationContext.getBeansOfType(Student.class).get("voterI‌​d") 
+0

Я пробовал, но не работал –

+0

@sidharthapani попробуйте это - 'applicationContext.getBeansOfType (Student.class) .get (" voterId ")' – Arpit

1

Это, вероятно, потому, что вы расширили классы в том, что order..and ваш test.xml не имеет боб с Стьюдента. Таким образом, он просто следует наследованию и находит родителя. Ниже строки заставляют его искать голосового бобона в test.xml, и он нашел его там. ContextConfiguration (locations = {"classpath: /com/spring/test2/test.xml"}) public class ContextJUnitTest

+0

Могу ли я переопределить расположение атрибутов в классе JUnit. Я имею в виду использование любого метода? –

+0

Зачем вам это делать ... просто обменивайтесь родительскими и студенческими бобами в соответствующих xml ... он должен работать нормально. – LNP

+0

Что я написал, является примером для моего проекта. Но в моем проекте я не должен менять это. –

Смежные вопросы