3

Spring を活用する既存の Java EE アプリケーションがあり、xml 構成から自動配線に移行しています。ほとんどの EJB を Spring Bean に変換したばかりですが、現在も MDB と EJB タイマーを使用しています。

  • 7.0でした
  • Java 6
  • 春 3.0.5
  • JUnit 4.8.1

また、JUnit で統合テストを作成中です。私の統合テストでは、WAS で実行する場合と同様にほとんどのコンテキスト構成ファイルを使用しますが、JNDI に結び付けたり、JTA トランザクション マネージャーを使用したりするものは使用しません。それらについては、ActiveMQ キュー、Hibernate トランザクション マネージャーなどをセットアップする同等のものがあります。

私のテストは次のようになります。

@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();
    }
}

私のテストには、少なくともいくつかの理由で問題があります。

  1. 自動配線で一部の Bean がスキップされる
  2. Bean がトランザクション用にプロキシされない場合がある

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

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

<context:annotation-config />

2 番目のエンティティは冗長だと思いますが、無害であるべきです。

ログにエラーはありません。ロギングをデバッグに切り替えて、ほとんどの Bean が自動配線されているのを確認しましたが、Spring のエラーはスキップされないようです。

項目 2 は項目 1 に関連している可能性があります。一部の Bean は、トランザクションを処理するために適切にプロキシされていません。私のJUnitのみのコンテキストでは、次のものがあります。

<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>

一部の場所ではトランザクションがないために休止状態エラーが発生しますが、他の場所では Bean がプロキシされてトランザクションが開始されます。プロキシされた Bean とプロキシされていない Bean の両方が のサブパッケージにありcom.mycompany.package1ます。

もちろん、WAS でアプリケーションを実行すると、これらすべてが機能します。ContextSingletonBeanFactoryLocator を使用します。JUnitでもそれを試しましたが、役に立たなかったようです。

助けてくれてありがとう。

4

1 に答える 1

0

テストクラスは次から拡張する必要があると思います:

AbstractTransactionalJUnit4SpringContextTests

そして、次を使用してトランザクションを構成できます。

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

ここで、defaultRollback は、すべてのテスト後にロールバックするかどうかを定義します。

于 2011-06-29T15:29:04.483 に答える