2016-10-12 6 views
2

CourseServiceImplのcourseDaoフィールドに模擬オブジェクトを追加しようとしていますが、動作しません。ReflectionTestUtilsがSpringテストで@Autowiredと動作しない

フィールド「courseDao」が見つかりませんでした。しかし、私は新しい演算子を使用してオブジェクトを作成すると、それは正常に動作します。

ReflectionTestUtils.setField(new CourseServiceImpl(), "courseDao", courseDao, CourseDao.class); 

サーブレット-config.xmlの

<mvc:annotation-driven /> 
<mvc:resources location="pdfs" mapping="/pdfs/**" /> 

<security:global-method-security 
    pre-post-annotations="enabled" /> 

<bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
    p:prefix="/WEB-INF/view/" p:suffix=".jsp" p:order="2" /> 

<bean 
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" 
    p:contentNegotiationManager-ref="contentNegId" p:defaultViews-ref="defaultViewList" 
    p:order="1" /> 

<bean id="contentNegId" 
    class="org.springframework.web.accept.ContentNegotiationManager"> 
    <constructor-arg> 
     <bean 
      class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy"> 
      <constructor-arg> 
       <map> 
        <entry key="json" value="application/json" /> 
        <entry key="xml" value="application/xml" /> 
       </map> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 

<util:list id="defaultViewList"> 
    <bean 
     class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> 
    <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
     <constructor-arg> 
      <bean class="org.springframework.oxm.xstream.XStreamMarshaller" 
       p:autodetectAnnotations="true" /> 
     </constructor-arg> 
    </bean> 
</util:list> 

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" 
    p:order="0" /> 

<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver" 
    p:defaultLocale="en" /> 

<bean id="messageSource" 
    class="org.springframework.context.support.ResourceBundleMessageSource" 
    p:basename="messages" /> 

<context:property-placeholder location="classpath:messages.properties" /> 

<import resource="/hibernate-config.xml" /> 
<import resource="/hibernate-config-test.xml" /> 

残りは同じであるため、別にプロファイル名から

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" 
     p:url="jdbc:mysql://localhost:3306/school-repo-test" p:username="user" 
     p:password="password" /> 


    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     p:dataSource-ref="myDataSource" p:hibernateProperties-ref="hibernateProps" 
     p:annotatedClasses-ref="mapClasses"> 
    </bean> 

    <util:list id="mapClasses"> 
     <value>org.school.model.Course</value> 
     <value>org.school.model.Role</value> 
     <value>org.school.model.Staff</value> 
     <value>org.school.model.Student</value> 
     <value>org.school.model.Subject</value> 
    </util:list> 

    <util:properties id="hibernateProps"> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     <prop key="hibernate.show_sql">true</prop> 
    </util:properties> 

    <bean id="txManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
     p:sessionFactory-ref="sessionFactory" /> 

-CONFIG-のtest.xmlを休止hibernate-configファイル。

CourseServiceImpl

@Service(value = "courseService") 
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
public class CourseServiceImpl implements CourseService { 
    @Autowired 
    private MessageSource messageSource; 
    @Autowired 
    private CourseDao courseDao; 
    @Autowired 
    private ApplicationContext context; 

お知らせください。

+0

「servlet-config.xml」の内容を提供してください。 –

+0

@SergeyBespalov問題が更新されました。あなたのケースでは –

答えて

1

あなたCourseServiceImplクラスは、Beanインスタンスは、それがCourseServiceTestに依存関係として注入する前に"Transational"プロキシで包み、Springコンテキスト内のすべての他のBeanことを意味@Transactional注釈を持っています。このようなプロキシインスタンスは、元のCourseServiceImplインスタンスのすべてのprivateフィールドを隠します。

注入さcourseServiceインスタンスは、それ以上のオリジナルCourseServiceImplクラスではありませんので、あなたがしたいフィールドにアクセスすることはできません、それはダイナミックcglibまたはJDKプロキシクラスです。

+0

[this](http://stackoverflow.com/a/34477414/6825250)解決策を使用することができます。 –

+0

お返事ありがとうございます。だから、新しい演算子を使ってインスタンスを作成すると、 '' Transactional "'プロキシでラップされません。これは正しいのですか?はいの場合、通常はnew演算子を使用してインスタンスを作成してサービス層をテストしますか? –

+0

>>> "新しい演算子を使用してインスタンスを作成すると、" Transactional "プロキシでラップされませんが、これは正しいですか? はい >>> "そうなら、通常はnew演算子を使用してインスタンスを作成してサービスレイヤをテストしますか?" いいえ、春のサービスの場合は、あなたのテストですでに行われているように注入する必要があります。 –

関連する問題