2011-01-17 13 views
3

Springを活用し、xml構成からautowiringに移行している既存のJava EEアプリケーションがあります。ほとんどのEJBをSpring Beanに変換しましたが、現在はまだMDBとEJBタイマを使用しています。Spring JUnitテスト:オートワイヤリングとトランザクションの問題

  • 私はJUnitの中に統合テストを書くの過程でも、午前7.0
  • Java 6の
  • 春3.0.5
  • JUnitの4.8.1

ました。私の統合テストでは、ほとんどのコンテキスト構成ファイルがWASで実行されるように使用されますが、JNDIに関係するものやJTAトランザクションマネージャは使用されません。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "/junit-container-context.xml", 
    "/spring-contexts/service-context.xml", 
    "/spring-contexts/integration-context.xml", 
    "/available-tests-context.xml" }) 
public class TestCase1Runner { 

    @Autowired 
    TestCase1 test; 

    @Autowired 
    private ApplicationContext applicationContext; 

    @Before 
    public void setupErrorHandling() { 
     // Some setup 
    } 

    @Test 
    @Transactional 
    public void run() throws Exception { 
     test.executeTest(); 
    } 
} 

は私のテストが理由の少なくともカップルのための問題を抱えている:

人のために、私はセットアップActiveMQのキュー、Hibernateのトランザクションマネージャなど

は私のテストは、次のようになります同等物を持っています

  1. オートワイヤリングは時々豆が取引
ためにプロキシされていないいくつかの豆
  • をスキップ

    アイテム1は循環参照と関係があるようです。 autowiringに問題があったいくつかの豆のコピーを作った。私は同じパッケージでコピーを作った。コピーは配線されていますが、元のものはありません。私はその後、オリジナルからコピーにxmlコンテキストファイル内の参照を移動し始めました。そして、ある時点で、コピーはもはや有線にはなりませんが、オリジナルは元のとおりです。名前は私を:)保護するために変更して、私は(コンテキストファイルのいずれかに次のようにあります

    <context:component-scan 
        base-package="com.mycompany.package1,com.mycompany.package2" /> 
    
    <context:annotation-config /> 
    

    私は2番目のエンティティが冗長であると思いますが、無害でなければなりません。

    ログにエラーはありません。私はデバッグするためにロギングをオンにし、ほとんどの豆がautowiredになっているのを見ましたが、その春のエラーはスキップしていないようです。

    アイテム2はアイテム1に関連している可能性があります。一部のBeanはトランザクションを処理するために適切にプロキシされていません。

    <bean id="transactionManager" 
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
        <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
        <tx:attributes> 
         <tx:method name="*" propagation="REQUIRED" /> 
        </tx:attributes> 
    </tx:advice> 
    
    <aop:config> 
        <aop:pointcut id="servicePointcut" 
         expression="execution(public * com.mycompany.package1..*.*(..))" /> 
    
        <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut" /> 
    </aop:config> 
    

    他の場所で、豆がプロキシされると、トランザクションが開始されている間、トランザクションがないので、私はいくつかの場所で休止状態のエラーを取得しています:私のJUnitのみの文脈では、私は次のよう持っています。プロキシードと非プロキシーの両方の豆はサブパッケージcom.mycompany.package1にあります。

    もちろん、このすべてはWASでアプリケーションを実行するときに機能します。 ContextSingletonBeanFactoryLocatorを使用します。私はJUnitでもそれを試しましたが、それは助けに見えませんでした。

    ありがとうございました。

  • 答えて

    0

    私はあなたのテストクラスから拡張するべきだと思います:

    AbstractTransactionalJUnit4SpringContextTests 
    

    、その後、あなたがトランザクションのものを設定することができます。defaultRollbackは、すべてのテスト後にロールバックするかどうかを定義し

    @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 
    

    +0

    実際にこの問題が見つかりました。私は、混合物にPropertyOverrideConfigurerを持っていました。オーバーライドにマッチした豆は、プロキシしなかった場合の豆でした。だから私はオーバーライドファイルの値をコメントアウトし、すべてが期待どおりに動作するようにしました。 – objectuser

    関連する問題